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

时间:2018-05-08 10:16:39

标签: java spring spring-boot enums

我有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端点中反序列化枚举忽略大小写?

3 个答案:

答案 0 :(得分:6)

Spring Boot 2.0正在使用具有ACCEPT_CASE_INSENSITIVE_ENUMS功能的Jackson 2.9。您应该可以通过设置

来启用它
spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_ENUMS = true 

属性docs, Appendix A

答案 1 :(得分:1)

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);
}

答案 2 :(得分:0)

您可以为所有枚举创建通用转换器

package ru.grancall.kb.logging.service.dto.converter;

import lombok.AllArgsConstructor;
import org.apache.commons.lang3.EnumUtils;
import java.beans.PropertyEditorSupport;

@AllArgsConstructor
public class EnumConverter extends PropertyEditorSupport {
    private Class type;

    public void setAsText(String text) {
        setValue(EnumUtils.getEnum(type, text.toUpperCase()));
    }
}

然后在您的任何Controller中使用它:

@InitBinder
    public void initBinder(WebDataBinder dataBinder) {
        dataBinder.registerCustomEditor(YourEnum.class, new EnumConverter(YourEnum.class));
    }