反序列化枚举忽略 Spring Boot 控制器中的情况

2022-09-02 19:49:37

我有Spring Boot端点,它将枚举作为查询参数:

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

和枚举类:

public enum ExampleEnum {
    FIRST,
    SECOND,
}

如果我将大写枚举值传递给 endpoit,它会很好地反序列化,但它会为小写字母引发错误:

java.lang.IllegalArgumentException: No enum constant 

如何在Spring Boot Rest端点中反序列化枚举忽略案例?

此问题不是重复的,因为它与查询参数反序列化有关。


答案 1

编辑:下面的答案是不正确的。您必须定义一个自定义并将其注册到Spring,我在这篇文章中对此进行了解释。感谢@Dave在评论中指出这一点。PropertyEditor@InitBinder


Spring Boot 2.0使用的是Jackson 2.9,它具有ACCEPT_CASE_INSENSITIVE_ENUMS功能。您应该能够通过设置来启用它

spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_ENUMS = true 

属性,根据文档,附录 A


答案 2
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) {
        return Arrays.stream(ExampleEnum.values())
            .filter(exampleEnum -> exampleEnum.toString().equals(key.toUpperCase()))
            .findAny()
            .orElse(null);
}