mybatis-plus通用枚舉@JsonValue接收參數報錯No enum constant
最近在使用mybatis-plus時用到了通用枚舉,通過@JsonValue注解 向前端返回指定的字段,同時也可以接收前端返回的字段數據.
在使用@JsonValue時,確實可以做到數據庫查詢到數字自動轉為文字返回給前端,但是前端想通過文字查詢時,后端無法通過文字轉為枚舉對象,報出了 No enum constant xxxx.enums.ProcessState.未處理
后來經過查閱,@JsonValue 走的是Jackson 進行的序列化 和反序列化, 在spring中 get請求(也就是requestParam) 是不經過Jackson 進行反序列化的,所以后端無法正常接收如果使用post(通過請求體傳參 經過jackson反序列化)后端是可以正常接收到的.
通過查看spring源碼,spring默認只能通過枚舉 實例名 轉換為枚舉 實例對象 (也就是上圖中的 UNTREATED,PROCESSING 字符串 轉化為枚舉對象) .
解決辦法: 這就需要我們自己寫一個轉換器了, 下例中使用了hutool的工具類 hutool-反射工具 hutool - 類型轉換工具類
@SuppressWarnings({"rawtypes", "unchecked"}) public class EnumConverter implements ConverterFactory<String, Enum<?>> { @Override public <T extends Enum<?>> Converter<String, T> getConverter(Class<T> targetType) { return new StringToEnum<>(targetType); } private static class StringToEnum<T extends Enum> implements Converter<String, T> { private final Class<T> enumType; public StringToEnum(Class<T> enumType) { this.enumType = enumType; } @Override @Nullable public T convert(String source) { if (source.isEmpty()) { // It's an empty enum identifier: reset the enum value to null. return null; } try { //先通過name獲取枚舉 return (T) Enum.valueOf(enumType, source); } catch (Exception e) { Field[] declaredFields = enumType.getDeclaredFields(); for (Field declaredField : declaredFields) { JsonValue[] annotationsByType = declaredField.getAnnotationsByType(JsonValue.class); if (annotationsByType.length > 0) { String name = declaredField.getName(); Object convert = Convert.convert(declaredField.getType(), source); return getEnumObj(enumType, name, convert); } } } return null; } /** * 通過反射的方式 獲取枚舉實例對象 * * @param clazz 枚舉類型 * @param fieldName @JSONValue 所在的字段名 * @param source 前端傳進來的值 * @return 對應的枚舉實例 * @author jzw * @since 2021/11/12 10:11 */ private T getEnumObj(Class<T> clazz, String fieldName, Object source) { T[] enums = clazz.getEnumConstants(); if (null != enums) { for (T e : enums) { Object fieldValue = ReflectUtil.getFieldValue(e, fieldName); if (fieldValue.equals(source)) { return e; } } } return null; } } }
將轉換器配置進去即可
@Configuration public class MyWebMvcConfigure implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverterFactory(new EnumConverter()); } }
做完上面兩步 就完成了
到此這篇關于mybatis-plus通用枚舉@JsonValue接收參數報錯No enum constant的文章就介紹到這了,更多相關mybatis-plus @JsonValue參數報錯內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java RSA加密解密實現方法分析【附BASE64 jar包下載】
這篇文章主要介紹了Java RSA加密解密實現方法,結合實例形式分析了java基于第三方類庫javabase64-1.3.1.jar實現RSA加密解密功能的具體步驟與相關操作技巧,需要的朋友可以參考下2017-10-10簡單談談SpringMVC轉發(fā)和重定向的區(qū)別
下面小編就為大家?guī)硪黄唵握務凷pringMVC轉發(fā)和重定向的區(qū)別。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06