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