栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis-plus 通用枚举 @JsonValue 接收参数报错 No enum constant

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis-plus 通用枚举 @JsonValue 接收参数报错 No enum constant

最近在使用mybatis-plus时用到了通用枚举,通过@JsonValue注解 向前端返回指定的字段,同时也可以接收前端返回的字段数据.


在使用@JsonValue时,确实可以做到 将文字返还给前端,但是前端做查询的时候,将文字发送后端时则出现了问题,报出了 No enum constant xxxx.enums.ProcessState.未处理

后来经过查阅,@JsonValue 走的是Jackson 进行的序列化 和反序列化, 大家都知道 get请求(也就是requestParam) 是不经过Jackson 进行反序列化的,所以后端无法正常接收如果使用post(通过请求体传参 经过jackson反序列化)后端是可以正常接收到的.

通过查看spring源码,spring默认只能通过枚举 实例名 转换为枚举 实例对象 (也就是上图中的 UNTREATED,PROCESSING 字符串 转化为枚举对象) .

解决办法: 这就需要我们自己写一个转换器了, 下例中使用了hutool的工具类hutool-反射工具
hutool - 类型转换工具类

@SuppressWarnings({"rawtypes", "unchecked"})
public class EnumConverter implements ConverterFactory> {

	@Override
	public > Converter getConverter(Class targetType) {
		return new StringToEnum<>(targetType);
	}

	private static class StringToEnum implements Converter {

		private final Class enumType;

		public StringToEnum(Class 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;
		}

		
		private T getEnumObj(Class 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());
	}

}

做完上面两步 就完成了 快去试试吧!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/490020.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号