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