最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis-plus通用枚舉@JsonValue接收參數(shù)報(bào)錯(cuò)No enum constant

 更新時(shí)間:2023年09月26日 09:14:28   作者:鯨漁  
最近在使用mybatis-plus時(shí)用到了通用枚舉,遇到了問(wèn)題,本文主要介紹了mybatis-plus通用枚舉@JsonValue接收參數(shù)報(bào)錯(cuò)No enum constant,具有一定的參考價(jià)值,感興趣的可以了解一下

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

在使用@JsonValue時(shí),確實(shí)可以做到數(shù)據(jù)庫(kù)查詢到數(shù)字自動(dòng)轉(zhuǎn)為文字返回給前端,但是前端想通過(guò)文字查詢時(shí),后端無(wú)法通過(guò)文字轉(zhuǎn)為枚舉對(duì)象,報(bào)出了 No enum constant xxxx.enums.ProcessState.未處理

后來(lái)經(jīng)過(guò)查閱,@JsonValue 走的是Jackson 進(jìn)行的序列化 和反序列化, 在spring中 get請(qǐng)求(也就是requestParam) 是不經(jīng)過(guò)Jackson 進(jìn)行反序列化的,所以后端無(wú)法正常接收如果使用post(通過(guò)請(qǐng)求體傳參 經(jīng)過(guò)jackson反序列化)后端是可以正常接收到的.

通過(guò)查看spring源碼,spring默認(rèn)只能通過(guò)枚舉 實(shí)例名 轉(zhuǎn)換為枚舉 實(shí)例對(duì)象 (也就是上圖中的 UNTREATED,PROCESSING 字符串 轉(zhuǎn)化為枚舉對(duì)象) .

解決辦法: 這就需要我們自己寫(xiě)一個(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 {
				//先通過(guò)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;
		}
		/**
		 * 通過(guò)反射的方式 獲取枚舉實(shí)例對(duì)象
		 *
		 * @param clazz     枚舉類型
		 * @param fieldName @JSONValue 所在的字段名
		 * @param source    前端傳進(jìn)來(lái)的值
		 * @return 對(duì)應(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)錯(cuò)No enum constant的文章就介紹到這了,更多相關(guān)mybatis-plus @JsonValue參數(shù)報(bào)錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 線程的優(yōu)先級(jí)(setPriority)案例詳解

    Java 線程的優(yōu)先級(jí)(setPriority)案例詳解

    這篇文章主要介紹了Java 線程的優(yōu)先級(jí)(setPriority)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • JAVA文件讀取常用工具類(8種)

    JAVA文件讀取常用工具類(8種)

    JAVA操作文件在經(jīng)常會(huì)使用到,本文匯總了部分JAVA操作文件的讀取常用工具類,主要介紹了8種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-08-08
  • Springboot 全局時(shí)間格式化操作

    Springboot 全局時(shí)間格式化操作

    這篇文章主要介紹了Springboot 全局時(shí)間格式化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Win10安裝Maven與環(huán)境變量配置過(guò)程

    Win10安裝Maven與環(huán)境變量配置過(guò)程

    本文介紹Maven的安裝與配置方法,涵蓋下載、環(huán)境變量設(shè)置、本地倉(cāng)庫(kù)及鏡像配置,指導(dǎo)如何在IDEA中正確配置Maven,適用于Java及其他語(yǔ)言項(xiàng)目的構(gòu)建與依賴管理
    2025-08-08
  • Spring?Boot項(xiàng)目獲取resources目錄下文件并返回給前端的方案

    Spring?Boot項(xiàng)目獲取resources目錄下文件并返回給前端的方案

    我們?cè)陧?xiàng)目中經(jīng)常碰到需要讀取固定文件的場(chǎng)景,如模板文件,一般做法是將文件放在resources目錄下,程序通過(guò)多種方式可以順利讀取文件,這篇文章主要給大家介紹了關(guān)于Spring?Boot項(xiàng)目獲取resources目錄下文件并返回給前端的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Spring JPA事務(wù)管理與自定義操作實(shí)例解析(最新推薦)

    Spring JPA事務(wù)管理與自定義操作實(shí)例解析(最新推薦)

    在Spring框架中,數(shù)據(jù)持久化操作常常與事務(wù)管理緊密相關(guān),本文將深入探討Spring Data JPA中的事務(wù)管理機(jī)制,并結(jié)合具體實(shí)例,展示如何自定義事務(wù)行為以滿足不同的業(yè)務(wù)需求,感興趣的朋友一起看看吧
    2024-12-12
  • Java怎么獲取當(dāng)前時(shí)間、計(jì)算程序運(yùn)行時(shí)間源碼詳解(超詳細(xì)!)

    Java怎么獲取當(dāng)前時(shí)間、計(jì)算程序運(yùn)行時(shí)間源碼詳解(超詳細(xì)!)

    有的時(shí)候,我們需要查看某一段代碼的性能如何,最為簡(jiǎn)單的方式,可以通過(guò)計(jì)算該段代碼執(zhí)行的耗時(shí),來(lái)進(jìn)行簡(jiǎn)單的判斷,這篇文章主要給大家介紹了關(guān)于Java怎么獲取當(dāng)前時(shí)間、計(jì)算程序運(yùn)行時(shí)間的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • 基于java下載中g(shù)etContentLength()一直為-1的一些思路

    基于java下載中g(shù)etContentLength()一直為-1的一些思路

    下面小編就為大家?guī)?lái)一篇基于java下載中g(shù)etContentLength()一直為-1的一些思路。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java中的FutureTask實(shí)現(xiàn)異步任務(wù)代碼實(shí)例

    Java中的FutureTask實(shí)現(xiàn)異步任務(wù)代碼實(shí)例

    這篇文章主要介紹了Java中的FutureTask實(shí)現(xiàn)異步任務(wù)代碼實(shí)例,普通的線程執(zhí)行是無(wú)法獲取到執(zhí)行結(jié)果的,FutureTask?間接實(shí)現(xiàn)了?Runnable?和?Future?接口,可以得到子線程耗時(shí)操作的執(zhí)行結(jié)果,AsyncTask?異步任務(wù)就是使用了該機(jī)制,需要的朋友可以參考下
    2024-01-01
  • java創(chuàng)建以任意圖片為背景的窗口

    java創(chuàng)建以任意圖片為背景的窗口

    這篇文章主要為大家詳細(xì)介紹了java創(chuàng)建以任意圖片為背景的窗口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評(píng)論

通化市| 扎兰屯市| 库尔勒市| 上高县| 西畴县| 依兰县| 昌乐县| 孟津县| 武夷山市| 大余县| 阳东县| 崇阳县| 浦城县| 睢宁县| 隆尧县| 涿州市| 贡嘎县| 屏东县| 靖西县| 新丰县| 延津县| 宁德市| 阜宁县| 庆元县| 化州市| 闽清县| 永嘉县| 阳曲县| 安宁市| 曲松县| 信宜市| 上饶市| 中超| 洪雅县| 泰安市| 辛集市| 罗甸县| 韶关市| 高碑店市| 巴塘县| 安泽县|