我有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端点中反序列化枚举忽略大小写?
答案 0 :(得分:6)
Spring Boot 2.0正在使用具有ACCEPT_CASE_INSENSITIVE_ENUMS功能的Jackson 2.9。您应该可以通过设置
来启用它spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_ENUMS = true
答案 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));
}