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

spring boot 枚舉使用的坑整理

 更新時間:2019年08月29日 17:02:51   作者:二奎  
在本篇文章里我們給大家整理了關(guān)于spring boot 枚舉使用的坑以及相關(guān)知識點內(nèi)容,需要的朋友們學(xué)習(xí)下。

java 枚舉的功能挺多,但是坑更多,使用的時候要注意。如下面這個枚舉。

@Getter
@AllArgsConstructor
public enum EnumExpenseType implements BaseEnum {
  小歡喜(1),
  大歡喜(2);
  private final int value;
}

咋一看,沒什么問題,但是具體使用過程中,總是會出問題。原因就是這個枚舉沒有按照從0開始索引,除此之外即使從0開始,中間有斷的索引也會有問題。主要出現(xiàn)在以下方面:

1. 在controller的方法中,比如以這個枚舉為參數(shù),如下代碼:

@RequestMapping("/**")
  public String getRejectReasons(EnumExpenseType type) {
    return "";
  }

前臺傳入的參數(shù)如果是type:1, 那它值應(yīng)該是:小歡喜,實際上呢?

Caused by: java.lang.IllegalArgumentException: No enum constant com.**.EnumReasonType.1	at java.lang.Enum.valueOf(Enum.java:238) ~[?:1.8.0_111]	at org.springframework.core.convert.support.StringToEnumConverterFactory$StringToEnum.convert(StringToEnumConverterFactory.java:52) ~[spring-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]	at org.springframework.core.convert.support.StringToEnumConverterFactory$StringToEnum.convert(StringToEnumConverterFactory.java:38) ~[spring-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]	at org.springframework.core.convert.support.GenericConversionService$ConverterFactoryAdapter.convert(GenericConversionService.java:436) ~[spring-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]	at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:41) ~[spring-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]	at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:191) ~[spring-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]	at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:129) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]	at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:73) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]	at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:53) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]	at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:693) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]	at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:124) ~[spring-web-5.1.7.RELEASE.jar:5.1.7.RELEASE]	... 81 more

Failed to convert value of type 'java.lang.String' to required type 'com.**.EnumExpenseType';
nested exception is org.springframework.core.convert.ConversionFailedException:
Failed to convert from type [java.lang.String] to type [com.**.EnumExpenseType] for value '1';
nested exception is java.lang.IllegalArgumentException: No enum constant com.***.EnumExpenseType.1

實際上它卻報了個錯。轉(zhuǎn)換失敗了。

查看報錯信息,可以定位到是spring框架中StringToEnumConverterFactory中轉(zhuǎn)換失敗,具體代碼如下:

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
    public T convert(String source) {
      if (source.isEmpty()) {
        // It's an empty enum identifier: reset the enum value to null.
        return null;
      }
      return (T) Enum.valueOf(this.enumType, source.trim()); 
    }
  }

是Enum.valueOf這里報錯,Enum.valueOf的后面的值并不是我們的value,而是name(這里的小歡喜)。

所以,我們不能使用這個spring提供converter,需要自定義一個:StringToEnumConverterFactory

public class StringToEnumConverterFactory implements ConverterFactory<String, BaseEnum> {

  private static final Map<Class, Converter> converterMap = new HashMap<>();

  @Override
  public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
    Converter<String, T> converter = converterMap.get(targetType);
    if(converter == null) {
      converter = new StringToEnumConverter<>(targetType);
      converterMap.put(targetType, converter);
    }
    return converter;
  }

  class StringToEnumConverter<T extends BaseEnum> implements Converter<String, T> {
    private Map<String, T> enumMap = new HashMap<>();

    StringToEnumConverter(Class<T> enumType) {
      T[] enums = enumType.getEnumConstants();
      for(T e : enums) {
        enumMap.put(String.valueOf(e.getValue()), e);
      }
    }

    @Override
    public T convert(String source) {

      T t = enumMap.get(source);
      if (t == null) {
        // 異常可以稍后去捕獲
        throw new IllegalArgumentException("No element matches " + source);
      }
      return t;
    }
  }

}

然后再將這個工廠配置到項目中WebMvcConfigurationSupport:

@Override
  public void addFormatters(FormatterRegistry registry) {
    registry.addConverterFactory(new StringToEnumConverterFactory());

  }

意思就是string 轉(zhuǎn) BaesEnum都走這個converter。

至此這個坑就算解決了。

以上就是本次介紹的全部知識點內(nèi)容,感謝大家對腳本之家的支持。

相關(guān)文章

  • 如何獲取springboot打成jar后的classpath

    如何獲取springboot打成jar后的classpath

    這篇文章主要介紹了如何獲取springboot打成jar后的classpath問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java設(shè)計模式編程之工廠方法模式的使用

    Java設(shè)計模式編程之工廠方法模式的使用

    這篇文章主要介紹了Java設(shè)計模式編程之工廠方法模式的使用,工廠方法模式屬于設(shè)計模式中三種工廠模式中的一種,需要的朋友可以參考下
    2016-02-02
  • JAVA中while循環(huán)的使用與注意事項

    JAVA中while循環(huán)的使用與注意事項

    這篇文章主要介紹了while循環(huán)在編程中的應(yīng)用,包括其基本結(jié)構(gòu)、語句示例、適用場景以及注意事項,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • Mybatis傳入List實現(xiàn)批量更新的示例代碼

    Mybatis傳入List實現(xiàn)批量更新的示例代碼

    這篇文章主要介紹了Mybatis傳入List實現(xiàn)批量更新的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java超全面梳理內(nèi)部類的使用

    Java超全面梳理內(nèi)部類的使用

    說起內(nèi)部類這個詞,想必很多人都不陌生,但是又會覺得不熟悉。原因是平時編寫代碼時可能用到的場景不多,用得最多的是在有事件監(jiān)聽的情況下,并且即使用到也很少去總結(jié)內(nèi)部類的用法。今天我們就來一探究竟
    2022-04-04
  • java中concat()方法的使用說明

    java中concat()方法的使用說明

    這篇文章主要介紹了java中concat()方法的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java中@Configuration使用場景

    java中@Configuration使用場景

    本文主要介紹了java中@Configuration使用場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • SpringBoot快速通關(guān)自動配置應(yīng)用

    SpringBoot快速通關(guān)自動配置應(yīng)用

    在進(jìn)行項目編寫前,我們還需要知道一個東西,就是SpringBoot對我們的SpringMVC還做了哪些配置,包括如何擴展,如何定制,只有把這些都搞清楚了,我們在之后使用才會更加得心應(yīng)手
    2022-07-07
  • 詳解Java中hashCode的作用

    詳解Java中hashCode的作用

    這篇文章主要介紹了詳解Java中hashCode的作用的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 詳解java線程的開始、暫停、繼續(xù)

    詳解java線程的開始、暫停、繼續(xù)

    本文將介紹通過線程讀取文件內(nèi)容,并且可以控制線程的開始、暫停、繼續(xù),來控制讀文件。具有一定的參考作用,下面跟著小編一起來看下吧
    2017-01-01

最新評論

若羌县| 禹州市| 永顺县| 应城市| 吴旗县| 广东省| 保亭| 昌黎县| 同德县| 罗平县| 育儿| 周至县| 云安县| 康保县| 敖汉旗| 阿克苏市| 呼伦贝尔市| 启东市| 疏附县| 苗栗市| 铜山县| 龙里县| 琼中| 利川市| 建阳市| 台山市| 蒙阴县| 香格里拉县| 九龙坡区| 故城县| 长乐市| 凤阳县| 陵水| 涪陵区| 彭山县| 大竹县| 台江县| 北海市| 达州市| 鄂托克前旗| 泰来县|