欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis-plus通用枚舉@JsonValue接收參數報錯No enum constant

 更新時間:2023年09月26日 09:14:28   作者:鯨漁  
最近在使用mybatis-plus時用到了通用枚舉,遇到了問題,本文主要介紹了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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論