web-dev-qa-db-ja.com

Spring Bootコントローラーで大文字と小文字を区別せずに列挙型をデシリアライズする

クエリパラメータとして列挙型を持つSpring Bootエンドポイントがあります。

@GetMapping("/example")
public List<Example> getByEnum(@RequestParam(name = "exampleEnum", required = false) ExampleEnum exampleEnum) {
    // code
}

そして列挙型クラス:

public enum ExampleEnum {
    FIRST,
    SECOND,
}

エンドポイントに大文字の列挙値を渡すと、デシリアライズはうまくいきますが、小文字の場合はエラーがスローされます。

Java.lang.IllegalArgumentException: No enum constant 

Spring Boot Restエンドポイントで大文字と小文字を区別せずに列挙型をデシリアライズする方法は?

この質問はクエリパラメータの逆シリアル化に関連しているため、重複していません。

7
Justas

Spring Boot 2.0は、 ACCEPT_CASE_INSENSITIVE_ENUMS 機能を持つJackson 2.9を使用しています。あなたは設定することでそれを有効にすることができるはずです

spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_ENUMS = true 

ドキュメント、付録A のプロパティ。

12
Karol Dowbecki
import com.fasterxml.jackson.annotation.JsonCreator;
import Java.util.Arrays;
import Java.util.Optional;
public enum ExampleEnum {
    FIRST,
    SECOND;

    @JsonCreator
    public static ExampleEnum setValue(String key) {
    Optional<ExampleEnum> exampleEnum = Arrays.stream(ExampleEnum.values())
            .filter(exampleEnum -> exampleEnum.toString().equals(key.toUpperCase()))
            .findAny();
    return exampleEnum.orElse(null);
}
1