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参数报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java日期时间及日期相互转换实现代码

    Java日期时间及日期相互转换实现代码

    这篇文章主要介绍了Java日期时间及日期相互转换实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java使用dbcp2数据库连接池

    java使用dbcp2数据库连接池

    这篇文章主要为大家详细介绍了java使用dbcp2数据库连接池的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 基于Java实现互联网实时聊天系统(附源码)

    基于Java实现互联网实时聊天系统(附源码)

    Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。本文将利用它实现互联网实时聊天系统,感兴趣的可以了解一下
    2022-09-09
  • 给@Value设置默认值以及为static变量赋值问题

    给@Value设置默认值以及为static变量赋值问题

    在Spring框架中,@Value注解用于属性注入,可将配置文件中的值赋给变量,未指定默认值时,若配置文件缺少相应属性,程序启动会报错,可通过设定默认值防止此问题,对于静态变量,由于@Value无法直接注入,需通过Set方法赋值,该方法也支持默认值设置
    2024-09-09
  • SpringBoot初始教程之统一异常处理详解

    SpringBoot初始教程之统一异常处理详解

    本篇文章主要介绍了SpringBoot初始教程之统一异常处理详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • RxJava2.x+ReTrofit2.x多线程下载文件的示例代码

    RxJava2.x+ReTrofit2.x多线程下载文件的示例代码

    本篇文章主要介绍了RxJava2.x+ReTrofit2.x多线程下载文件的示例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-09-09
  • Java可视化之实现文本的加密和解密

    Java可视化之实现文本的加密和解密

    这篇文章主要介绍了Java可视化之实现文本的加密和解密,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • JVM教程之内存管理和垃圾回收(三)

    JVM教程之内存管理和垃圾回收(三)

    这篇文章主要介绍了JVM学习笔记的第三篇内存管理和垃圾回收,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 关于logBack配置日志文件及编码配置的问题

    关于logBack配置日志文件及编码配置的问题

    这篇文章主要介绍了logBack配置日志文件及编码配置的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 如何使用SpringMVC的消息转换器设置日期格式

    如何使用SpringMVC的消息转换器设置日期格式

    这篇文章主要介绍了如何使用SpringMVC的消息转换器设置日期格式问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论