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参数报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Boot项目获取resources目录下文件并返回给前端的方案
我们在项目中经常碰到需要读取固定文件的场景,如模板文件,一般做法是将文件放在resources目录下,程序通过多种方式可以顺利读取文件,这篇文章主要给大家介绍了关于Spring Boot项目获取resources目录下文件并返回给前端的相关资料,需要的朋友可以参考下2024-07-07
Spring JPA事务管理与自定义操作实例解析(最新推荐)
在Spring框架中,数据持久化操作常常与事务管理紧密相关,本文将深入探讨Spring Data JPA中的事务管理机制,并结合具体实例,展示如何自定义事务行为以满足不同的业务需求,感兴趣的朋友一起看看吧2024-12-12
Java怎么获取当前时间、计算程序运行时间源码详解(超详细!)
有的时候,我们需要查看某一段代码的性能如何,最为简单的方式,可以通过计算该段代码执行的耗时,来进行简单的判断,这篇文章主要给大家介绍了关于Java怎么获取当前时间、计算程序运行时间的相关资料,需要的朋友可以参考下2024-07-07
基于java下载中getContentLength()一直为-1的一些思路
下面小编就为大家带来一篇基于java下载中getContentLength()一直为-1的一些思路。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-06-06


最新评论