1. 程式人生 > 其它 >JavaWeb列舉使用講解——超詳細!!!

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