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

springboot枚舉類型傳遞的步驟

 更新時間:2021年04月12日 11:59:27   作者:鯨冬香  
這篇文章主要介紹了springboot枚舉類型傳遞的步驟,幫助大家更好的理解和學(xué)習(xí)使用springboot,感興趣的朋友可以了解下

在本周寫項目時,需要將枚舉類型作為參數(shù)進行傳遞。

測試

首先先建立一個枚舉類:

public enum ScoreType  {
    TOTAL_SCORE("總評成績"),
    MIDDLE_SCORE("期中成績"),
    FINAL_SCORE("期末成績");
    String des; // 描述
    ScoreType(String des) {
        this.des = des;
    }
    public String getDes() {
        return des;
    } 
}

再建立一個枚舉api接口:

@RestController
@RequestMapping("/Klass")
public class KlassController {
    @GetMapping("testEnum")
    public String testEnum(@RequestParam ScoreType scoreType) {
        return "枚舉序號:" + scoreType.ordinal() + ",枚舉名:" + scoreType.name();
    }
}

進行測試,使用枚舉名發(fā)送數(shù)據(jù):

使用枚舉序號發(fā)送數(shù)據(jù):

由此可見,在springboot默認請求參數(shù)映射中,枚舉類型只能通過枚舉名來進行參數(shù)映射,但有時候我們需要用序號來做映射。

Converter

顧明思議Converter就是轉(zhuǎn)換的意思,我們可以通過定義的Converter來確定參數(shù)到枚舉類型之間的轉(zhuǎn)換:

public class BaseEnumConverter<T extends Enum> implements Converter<String, T> {
    private Map<String, T> enumMap = new HashMap<>();
    public BaseEnumConverter(Class<T> enumType) {
        T[] enums = enumType.getEnumConstants();
        for (T e : enums) {
            enumMap.put(String.valueOf(e.ordinal()), e);
            enumMap.put(e.name(), e);
        }
    }
    @Override
    public T convert(String source) {
        T t1 = enumMap.get(source.toLowerCase());
        T t2 = enumMap.get(source.toUpperCase());
        if (t1 == null && t2 == null) {
            throw new IllegalArgumentException("無法匹配對應(yīng)的枚舉類型");
        }
        return t1 == null ? t2 : t1;
    }
}

分析代碼,根據(jù)運行時具體枚舉類的參數(shù),獲取所有枚舉值,并將各個枚舉值序列和枚舉值名與枚舉值之間做映射(保存在Map中),如上述枚舉類型,將會生成以下Map:

0 => ScoreType.TOTAL_SCORE
TOTAL_SCORE => ScoreType.TOTAL_SCORE
1 => ScoreType.MIDDLE_SCORE
MIDDLE_SCORE => ScoreType.MIDDLE_SCORE
2 => ScoreType.FINAL_SCORE
FINAL_SCORE => ScoreType.FINAL_SCORE

通過此Converter,就可以實現(xiàn)前臺傳序號和枚舉名,都能成功映射到枚舉類型,將此Converter通過工廠模式提供到springboot中:

public class BaseEnumConverterFactory implements ConverterFactory<String, Enum> {
    private static final Map<Class, Converter> CONVERTERS = new HashMap<>();
    @Override
    public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
        // 每一個類型創(chuàng)建一個轉(zhuǎn)換器
        Converter<String, T> converter = CONVERTERS.get(targetType);
        if (converter == null) {
            converter = new BaseEnumConverter<>(targetType);
            CONVERTERS.put(targetType, converter);
        }
        return converter;
    }
}

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverterFactory(new BaseEnumConverterFactory());
    }
}

進行測試,使用枚舉名發(fā)送數(shù)據(jù):

靈活化

為了保證靈活性,每個枚舉類型可以自定義轉(zhuǎn)換的方式,建立一個接口,對接口進行類型轉(zhuǎn)換,建立一個BaseEnum接口:

public interface BaseEnum {
    String[] getKeys(); //返回的keys可轉(zhuǎn)換為BaseEnum
}

枚舉類實現(xiàn)此接口,并定義映射方式

public enum ScoreType implements BaseEnum {
    TOTAL_SCORE("總評成績"),
    MIDDLE_SCORE("期中成績"),
    FINAL_SCORE("期末成績");
    String des; // 描述
    ScoreType(String des) {
        this.des = des;
    }
    public String getDes() {
        return des;
    }
    @Override
    public String[] getKeys() {
        String[] s = {String.valueOf(this.ordinal()), this.name()}; // 次序和名字都可轉(zhuǎn)為枚舉,如0和total_score => ScoreType.TOTAL_SCORE
    return s;
    }
}

轉(zhuǎn)換器統(tǒng)一對BaseEnum進行轉(zhuǎn)換:

public class BaseEnumConverter<T extends BaseEnum> implements Converter<String, T> {
    private Map<String, T> enumMap = new HashMap<>();
    public BaseEnumConverter(Class<T> enumType) {
        T[] enums = enumType.getEnumConstants();
        // 根據(jù)keys建立轉(zhuǎn)換
        for (T e : enums) {
            for (String key : e.getKeys()) {
                enumMap.put(key, e);
            }
        }
    }
    @Override
    public T convert(String source) {
        T t1 = enumMap.get(source.toLowerCase());
        T t2 = enumMap.get(source.toUpperCase());
        if (t1 == null && t2 == null) {
            throw new IllegalArgumentException("無法匹配對應(yīng)的枚舉類型");
        }
        return t1 == null ? t2 : t1;
    }
}

對于每個枚舉類型,可通過返回的keys來自定義轉(zhuǎn)換的方式。

以上就是springboot枚舉類型傳遞的步驟的詳細內(nèi)容,更多關(guān)于springboot枚舉類型傳遞的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一次線上websocket返回400問題排查的實戰(zhàn)記錄

    一次線上websocket返回400問題排查的實戰(zhàn)記錄

    最近項目中有端對端通信場景,實時性要求較高,考慮后選用了websocket 這一通信協(xié)議,下面這篇文章主要給大家介紹了一次線上websocket返回400問題排查的實戰(zhàn)記錄,需要的朋友可以參考下
    2022-04-04
  • SpringBoot實現(xiàn)嵌入式 Servlet容器

    SpringBoot實現(xiàn)嵌入式 Servlet容器

    傳統(tǒng)的Spring MVC工程部署時需要將WAR文件放置在servlet容器的文檔目錄內(nèi),而Spring Boot工程使用嵌入式servlet容器省去了這一步驟,本文就來設(shè)置一下相關(guān)配置,感興趣的可以了解一下
    2023-12-12
  • Java的JSTL標(biāo)簽庫詳解

    Java的JSTL標(biāo)簽庫詳解

    JSTL包含用于編寫和開發(fā)JSP頁面的一組標(biāo)準(zhǔn)標(biāo)簽,它可以為用戶提供一個無腳本環(huán)境。在此環(huán)境中,用戶可以使用標(biāo)簽編寫代碼,而無須使用Java腳本
    2023-05-05
  • 重新啟動IDEA時maven項目SSM框架文件變色所有@注解失效

    重新啟動IDEA時maven項目SSM框架文件變色所有@注解失效

    這篇文章主要介紹了重新啟動IDEA時maven項目SSM框架文件變色所有@注解失效,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 如何在maven本地倉庫中添加oracle的jdbc驅(qū)動

    如何在maven本地倉庫中添加oracle的jdbc驅(qū)動

    文章介紹了在Maven項目中添加Oracle數(shù)據(jù)庫驅(qū)動ojdbc5時遇到的問題以及解決問題的兩種方法,方法一為簡單粗暴,但沒有體現(xiàn)Maven倉庫的作用,需要手動管理jar包,方法二為在Maven本地倉庫中添加Oracle的JDBC驅(qū)動,過程較為繁瑣,但配置一次后可以多次使用
    2024-11-11
  • Java并發(fā)編程之淺談ReentrantLock

    Java并發(fā)編程之淺談ReentrantLock

    今天帶大家學(xué)習(xí)Java并發(fā)編程的相關(guān)知識,文中對Java ReentrantLock作了非常詳細的圖文示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • java集合遍歷的幾種方式總結(jié)及詳細比較

    java集合遍歷的幾種方式總結(jié)及詳細比較

    下面小編就為大家?guī)硪黄猨ava集合遍歷的幾種方式總結(jié)及詳細比較。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • elasticsearch開發(fā)中data-streams使用解析

    elasticsearch開發(fā)中data-streams使用解析

    這篇文章主要為大家介紹了elasticsearch開發(fā)中data-streams使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • java設(shè)計模式之工廠方法詳解

    java設(shè)計模式之工廠方法詳解

    這篇文章主要為大家詳細介紹了java設(shè)計模式之工廠方法的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 利用hadoop查詢兩兩之間有共同好友及他倆的共同好友都是誰

    利用hadoop查詢兩兩之間有共同好友及他倆的共同好友都是誰

    一想到要實現(xiàn)求共同好友的功能,很多人都會想到redis來實現(xiàn)。但是redis存儲和數(shù)據(jù)和計算時需要耗費較多的內(nèi)存資源。所以文本將介紹另一種方法,即利用Hadoop中的MapReduce來實現(xiàn),感興趣的可以了解一下
    2022-01-01

最新評論

宜丰县| 涿州市| 襄樊市| 合肥市| 长寿区| 甘南县| 奉化市| 怀来县| 新源县| 岳普湖县| 洪江市| 织金县| 永宁县| 新干县| 军事| 马山县| 嘉荫县| 从江县| 靖江市| 苏尼特左旗| 三原县| 平乡县| 北安市| 黄浦区| 平顶山市| 双峰县| 历史| 海淀区| 灵宝市| 华阴市| 陕西省| 德钦县| 兴仁县| 两当县| 洛浦县| 和林格尔县| 龙州县| 乐业县| 滨州市| 集安市| 六盘水市|