mybatis-plus通用枚舉@JsonValue接收參數(shù)報(bào)錯No enum constant
最近在使用mybatis-plus時(shí)用到了通用枚舉,通過@JsonValue注解 向前端返回指定的字段,同時(shí)也可以接收前端返回的字段數(shù)據(jù).

在使用@JsonValue時(shí),確實(shí)可以做到數(shù)據(jù)庫查詢到數(shù)字自動轉(zhuǎn)為文字返回給前端,但是前端想通過文字查詢時(shí),后端無法通過文字轉(zhuǎn)為枚舉對象,報(bào)出了 No enum constant xxxx.enums.ProcessState.未處理
后來經(jīng)過查閱,@JsonValue 走的是Jackson 進(jìn)行的序列化 和反序列化, 在spring中 get請求(也就是requestParam) 是不經(jīng)過Jackson 進(jìn)行反序列化的,所以后端無法正常接收如果使用post(通過請求體傳參 經(jīng)過jackson反序列化)后端是可以正常接收到的.
通過查看spring源碼,spring默認(rèn)只能通過枚舉 實(shí)例名 轉(zhuǎn)換為枚舉 實(shí)例對象 (也就是上圖中的 UNTREATED,PROCESSING 字符串 轉(zhuǎn)化為枚舉對象) .

解決辦法: 這就需要我們自己寫一個(gè)轉(zhuǎn)換器了, 下例中使用了hutool的工具類 hutool-反射工具 hutool - 類型轉(zhuǎn)換工具類
@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;
}
/**
* 通過反射的方式 獲取枚舉實(shí)例對象
*
* @param clazz 枚舉類型
* @param fieldName @JSONValue 所在的字段名
* @param source 前端傳進(jìn)來的值
* @return 對應(yīng)的枚舉實(shí)例
* @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;
}
}
}將轉(zhuǎn)換器配置進(jìn)去即可
@Configuration
public class MyWebMvcConfigure implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(new EnumConverter());
}
}做完上面兩步 就完成了
到此這篇關(guān)于mybatis-plus通用枚舉@JsonValue接收參數(shù)報(bào)錯No enum constant的文章就介紹到這了,更多相關(guān)mybatis-plus @JsonValue參數(shù)報(bào)錯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)將Doc/Docx格式的Word文檔轉(zhuǎn)換為PDF文件
這篇文章主要為大家詳細(xì)介紹了如何通過Java將Word文檔轉(zhuǎn)換為PDF、PDF/A和密碼保護(hù)的PDF文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-08-08
Spring元注解@HttpExchange聲明式調(diào)用HTTP
這篇文章主要介紹了Spring元注解@HttpExchange聲明式調(diào)用HTTP,Spring?Framework6和Spring?Boot3引入了聲明式HTTP客戶端@HttpExchange,通過接口注解簡化REST?API調(diào)用,核心注解包括@GetExchange、@PostExchange等對應(yīng)HTTP方法,支持路徑參數(shù)和請求體,需要的朋友可以參考下2025-10-10
為什么Java是程序員受歡迎的語言這幾個(gè)原因你該清楚
Java一直穩(wěn)居程序員很受歡迎的編程語言的榜首,是企業(yè)中使用最廣泛的編程語言。這篇文章主要介紹了為什么Java是程序員受歡迎的語言這幾個(gè)原因你該清楚,需要的朋友可以參考下2020-07-07
springboot+redis+lua實(shí)現(xiàn)分布式鎖的腳本
本文介紹了如何使用Spring Boot、Redis和Lua腳本實(shí)現(xiàn)分布式鎖,包括實(shí)現(xiàn)原理、代碼實(shí)現(xiàn)和存在的問題,感興趣的朋友跟隨小編一起看看吧2024-11-11
Spring Boot中使用Spring-data-jpa實(shí)現(xiàn)數(shù)據(jù)庫增刪查改
本篇文章主要介紹了Spring Boot中使用Spring-data-jpa實(shí)現(xiàn)增刪查改,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03
Mybatis-Plus中IdType.AUTO局部配置不生效的問題解決
本文主要介紹了Mybatis-Plus中IdType.AUTO局部配置不生效的問題解決,數(shù)據(jù)庫插入數(shù)據(jù)時(shí),id的默認(rèn)生成方式還是雪花算法,局部配置沒有生效,下面就來解決一下,感興趣的可以了解一下2023-09-09
JAVAEE Filter 過濾器設(shè)置是否緩存實(shí)例詳解
網(wǎng)頁中,每次的客戶端訪問服務(wù)器,有部分不用重復(fù)請求的,這樣可以減輕服務(wù)器的工作量。那么如何設(shè)置客戶端是否都緩存呢?接下來通過本文給大家介紹JAVAEE Filter 過濾器設(shè)置是否緩存的實(shí)例,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn)代碼
這篇文章主要介紹了springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn),JSR303校驗(yàn)方法有統(tǒng)一校驗(yàn)的需求,統(tǒng)一校驗(yàn)實(shí)現(xiàn)以及分組校驗(yàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
Java的非阻塞隊(duì)列ConcurrentLinkedQueue解讀
這篇文章主要介紹了Java的非阻塞隊(duì)列ConcurrentLinkedQueue解讀,在并發(fā)編程中,有時(shí)候需要使用線程安全的隊(duì)列,如果要實(shí)現(xiàn)一個(gè)線程安全的隊(duì)列有兩種方式:一種是使用阻塞算法,另一種是使用非阻塞算法,需要的朋友可以參考下2023-12-12

