zoukankan      html  css  js  c++  java
  • JavaWeb枚举使用讲解——超详细!!!

    枚举使用问题

    ​ web开发中,枚举通常用来做状态码,码表值等等,所以我们在三层架构中经常会用到他,通过前端传值,遍历枚举项,一个个手动比较。手动比较还是比较繁琐,这里介绍框架自动装换的方法来简化日常开发!

    Jackson枚举简化操作

    ​ springBoot默认集成的是Jackson序列化器,该序列化器有以下两种注解来解决枚举的序列化与反序列化。

    一、@JsonCreator

    此注解用来枚举值反序列化为枚举对象使用,通常使用在Controller层入参,但是这种方式入参只能是请求头为ContentType为application/json的请求。其他的都不行,详细可以了解以下springboot与jackson,这里不做详解。如果想要将表单请求中的枚举值转换为枚举,那只能通过Spring的Converter来完成,后面做详解。

    二、@JsonValue

    次注解用来序列化对象的,标注在get方法上,标注后将返回get方法的值

    代码如下:

    public class ConstantUtils {
        public enum Demo{
            TEST1(1,"我是一"),
            TEST2(2,"我是二"),
            TEST3(3,"我是三"),
            TEST4(4,"我是四"),
            TEST5(5,"我是五"),
            TEST6(6,"我是六")
            ;
            Demo(int code,String name){
                this.code = code;
                this.name = name;
            }
            public int code;
            private String name;
    
            @JsonCreator   
            public static Demo getDemo(int code){
                for (Demo value : values()) {
                    if (value.code == code) {
                        return value;
                    }
                }
                return null;
            }
    
            @JsonValue
            public String getName() {
                return name;
            }
        }
    }
    

    Mybatis枚举简化操作

    ​ 这里用我用我常用的mybatis的衍生mybatis-plus举例。mp(mybatis-plus)中简化枚举就很简单,将枚举继承IEnum接口,实现其方法即可。如下

    public enum Demo implements IEnum<Integer>{
            TEST1(1,"我是一"),
            TEST2(2,"我是二"),
            TEST3(3,"我是三"),
            TEST4(4,"我是四"),
            TEST5(5,"我是五"),
            TEST6(6,"我是六")
            ;
            Demo(int code,String name){
                this.code = code;
                this.name = name;
            }
            public int code;
            private String name;
    
            @Override   //实现方法
            public Integer getValue() {
                return this.code;
            }
        }
    

    ​ 传入的泛型为数据库存的类型值,通过实现方法获取枚举值与数据库中的值比较取枚举。

    ​ 相比mybatis原生的可能要简单不少,mybatis许撩了解typeHandle接口,这里就不详解,感兴趣这边请.

    Spring枚举转换

    ​ 在前面说到,Controller层入参Jackson不能接受表单中有枚举,可以通过Convert来解决,这种方法相对比较麻烦,但是能够解决很多参数转化问题。

    ​ 具体操作如下

    @Component
    public class MyConverter implements ConverterFactory<String, ConstantUtils.Demo> {
        @Override
        public <T extends ConstantUtils.Demo> Converter<String, T> getConverter(Class<T> aClass) {
            return source -> {
                for (T enumConstant : aClass.getEnumConstants()) {
                    boolean b = enumConstant.getCode() == Integer.valueOf(source);
                    System.out.println(b);
                    if (b)
                        return enumConstant;
                }
                return null;
            };
        }
    }
    
    @Configuration
    public class MvcConfig extends WebMvcConfigurationSupport {
        @Autowired
        private MyConverter converter;
    
        @Override
        protected void addFormatters(FormatterRegistry registry) {
            super.addFormatters(registry);
            registry.addConverterFactory(converter);
        }
    }
    

    ​ 其中ConverterFactory<String, ConstantUtils.Demo>左边为web请求入参,右边为需要转换的枚举类型。方法很简单,其实与上面的操作也都详细,获取一个值,内部循环所有的枚举值,知道相等返回,不相等则返回null。

    ​ 以上为我翻阅资料和自己的以前的积累,希望能帮到你!

    ​ 下面为参考的一些博客。

    1. https://blog.csdn.net/z69183787/article/details/54292789/
    
    2. https://blog.csdn.net/weixin_38560512/article/details/115583234
    3. https://blog.csdn.net/chenlu4447/article/details/100626415
  • 相关阅读:
    hdu_5750_Dertouzos(线性筛)
    hdu_5748_Bellovin(LIS)
    Codeforces Round #364 (Div. 2) C.They Are Everywhere
    Codeforces Round #364 (Div. 2) D. As Fast As Possible
    [BZOJ 2456]Mode(神奇的抵销)
    [poj3046]Ant Counting(母函数)
    [poj1742]coin
    [poj3666]Making the Grade(DP/左偏树)
    【POJ各种模板汇总】(写在逆风省选前)(不断更新中)
    [USACO2004][poj1989]The Cow Lineup(乱搞)
  • 原文地址:https://www.cnblogs.com/theStone/p/15478063.html
Copyright © 2011-2022 走看看