在Spring Boot控制器中反序列化枚举忽略大小写

Jus*_*tas 6 java enums spring spring-boot

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

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

和枚举类:

public enum ExampleEnum {
    FIRST,
    SECOND,
}
Run Code Online (Sandbox Code Playgroud)

如果我将大写枚举值传递给endpoit,它反序列化很好,但它会抛出小写错误:

java.lang.IllegalArgumentException: No enum constant 
Run Code Online (Sandbox Code Playgroud)

如何在Spring Boot Rest端点中反序列化枚举忽略大小写?

Kar*_*cki 9

Spring Boot 2.0使用的是具有ACCEPT_CASE_INSENSITIVE_ENUMS功能的Jackson 2.9 .您应该可以通过设置启用它

spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_ENUMS = true 
Run Code Online (Sandbox Code Playgroud)

财产按文档,附录A.

  • Jackson 甚至没有在这里查看,因为我们没有反序列化消息正文 - Spring MVC 相反_转换_请求参数。为此,Spring 使用 DataBinder 的注册 PropertyEditors,或者,如果失败,则使用来自 Web ConversionService 的匹配 TypeConverter。要解决此问题,您应该扩展 PropertyEditorSupport 并添加 @InitBinder 注解的方法,将其注册到您的控制器。 (8认同)
  • 添加了属性和objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS); 但仍然得到java.lang.IllegalArgumentException:没有枚举常量 (4认同)
  • 我使用了两个:spring boot属性并在自定义对象映射器上启用.自定义ObjectMapper配置标记为\ @Bean\@Primary,因此它应该适用于所有图层. (2认同)

saj*_*jib 6

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);
}
Run Code Online (Sandbox Code Playgroud)