java 反序列化枚举忽略Sping Boot 控制器中的大小写

q3qa4bjr  于 2022-12-02  发布在  Java
关注(0)|答案(4)|浏览(216)

我的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端点中反序列化枚举忽略大小写?
此问题不重复,因为它与查询参数反序列化相关。

okxuctiv

okxuctiv1#

**EDIT:**下面的答案是不正确的。你必须定义一个自定义的PropertyEditor,并将其注册到Spring @InitBinder,我解释了in this post。感谢@Dave在评论中指出这一点。

Sping Boot 2.0使用的是Jackson2.9,它具有ACCEPT_CASE_INSENSITIVE_ENUMS功能。您应该可以通过设置

spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_ENUMS = true

属性符合docs, Appendix A

fwzugrvs

fwzugrvs2#

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

egdjgwm83#

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

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

7xllpg7q4#

如果你想不区分大小写地处理所有枚举,你可以使用Spring的ApplicationConversionService
您只需使用以下小配置注册它(请参阅baeldung):

@Configuration
public class EnumMappingConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        ApplicationConversionService.configure(registry);
    }
}

相关问题