解决MyBatis中Enum字段参数解析问题
admin
2023-04-30 22:32:39
目录

    基础Class和TypeHandler

    MyBatis操作的基本User对象结构如下:

    @Data
    @Alias(value = "user")
    public class User implements Serializable {
        private static final long serialVersionUID = -4947062488310146862L;
     
        private Long id;
     
        @NotNull(message = "用户名不能为空")
        private String userName;
     
        @NotNull(message = "备注不能为空")
        private String note;
     
        @NotNull(message = "性别不能为空")
        private SexEnum sex;
    }

    其中sex字段对应的类型为SexEnum枚举类型,因此同时设置了如下的TypeHandler,从而在前端传入参数和从数据库中取值时进行自动的名称转换。

    @MappedJdbcTypes(JdbcType.INTEGER)
    @MappedTypes(value = SexEnum.class)
    public class SexTypeHandler extends BaseTypeHandler {
        /**
         * 设置非空性别参数
         */
        @Override
        public void setNonNullParameter(PreparedStatement preparedStatement, int i, SexEnum sexEnum, JdbcType jdbcType) throws SQLException {
            preparedStatement.setInt(i, sexEnum.getId());
        }
     
        /**
         * 通过列名读取性别
         */
        @Override
        public SexEnum getNullableResult(ResultSet resultSet, String s) throws SQLException {
            int sex = resultSet.getInt(s);
            if (sex != 1 && sex != 2) {
                return null;
            }
            return SexEnum.getEnumById(sex);
        }
     
        /**
         * 通过下标读取性别
         */
        @Override
        public SexEnum getNullableResult(ResultSet resultSet, int i) throws SQLException {
            int sex = resultSet.getInt(i);
            if (sex != 1 && sex != 2) {
                return null;
            }
            return SexEnum.getEnumById(sex);
        }
     
        /**
         * 通过存储过程读取性别
         */
        @Override
        public SexEnum getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
            int sex = callableStatement.getInt(i);
            if (sex != 1 && sex != 2) {
                return null;
            }
            return SexEnum.getEnumById(sex);
        }
    }

    请求参数解析问题

    下面在使用axios post请求来更新用户信息,请求的JSON参数如下:

    {
          id: id,
          userName: username,
          sex: sex === 'MALE' ? 1 : 2, // 1: 男,2: 女
          note: note
    }
    

    其中由于sex字段的枚举类型,因此这里将sex根据select得到的option来转换为了枚举中的id对应的值。也就是:

    1: MALE
    2: FAMALE

    但在发出请求之后,服务端日志中出现如下的问题:

    2020-03-02 22:59:50.722  WARN 10864 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `cn.zyt.springbootlearning.domain.SexEnum` from number 2: index value outside legal index range [0..1]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `cn.zyt.springbootlearning.domain.SexEnum` from number 2: index value outside legal index range [0..1]
     at [Source: (PushbackInputStream); line: 1, column: 40] (through reference chain: cn.zyt.springbootlearning.domain.User["sex"])]

    问题解决

    对于该问题,可以使用枚举类型的desc来作为参数传递。当使用如下desc属性映射时,将JSON请求参数改成如下就可以解析成功不报错:

    {
          id: id,
          userName: username,
          sex: sex,
          note: note
    }
    

    此时对应的sex字段选择select标签如下:

    
      sex:
      
    

    同时注意:enum字段sex对应的数据库列的设置中,该列的数据类型为int,而不能为tinyint。tinyint数据类型对应于java中的boolean,1表示true,0表示false。

    到此这篇关于解决MyBatis中Enum字段参数解析问题的文章就介绍到这了,更多相关MyBatis Enum字段参数解析内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

    相关内容

    热门资讯

    脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
    世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
    demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
    北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
    苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
    世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
    应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
    猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
    长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
    阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
    脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
    demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
    北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
    苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
    长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
    阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
    猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...