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
posted @ 2021-10-28 22:31  站在巨人肩上的人  阅读(876)  评论(0编辑  收藏  举报