You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot控制器如何忽略大小写反序列化枚举查询参数?

解决Spring Boot REST端点枚举查询参数忽略大小写的问题

嘿,这个问题我之前也踩过坑!Spring Boot默认对枚举类型的查询参数是严格大小写匹配的,不过有几个实用的解决方案,挑适合你的场景来用:

方法一:全局自定义枚举转换器(最推荐)

Spring MVC在处理请求参数类型转换时会依赖Converter接口,我们可以自定义一个忽略大小写的转换器,全局生效:

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@Component
public class ExampleEnumConverter implements Converter<String, ExampleEnum> {
    @Override
    public ExampleEnum convert(String source) {
        // 先处理空值,避免空指针异常
        if (source == null || source.isBlank()) {
            return null;
        }
        // 将传入的字符串转成大写后匹配枚举
        return ExampleEnum.valueOf(source.toUpperCase());
    }
}

只要给这个类加上@Component注解,Spring就会自动识别并使用它来处理所有String到ExampleEnum的转换。不管你传的是first、First还是FIRST,都能正确映射到对应的枚举值。

方法二:控制器局部配置(仅当前接口生效)

如果不想全局修改,只想让某个控制器的接口支持忽略大小写,可以用@InitBinder注册一个属性编辑器:

@RestController
public class ExampleController {

    @InitBinder
    public void initExampleEnumBinder(WebDataBinder binder) {
        binder.registerCustomEditor(ExampleEnum.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                // 空值直接返回null,非空则转大写匹配
                setValue(text == null ? null : ExampleEnum.valueOf(text.toUpperCase()));
            }
        });
    }

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

这个配置只会对当前控制器里的接口生效,适合局部需求的场景。

方法三:给枚举类添加静态匹配方法(灵活可控)

你也可以在枚举类内部添加一个静态方法,手动处理大小写转换,然后在接口里直接调用:

public enum ExampleEnum {
    FIRST, SECOND;

    public static ExampleEnum fromString(String input) {
        if (input == null || input.isBlank()) {
            return null;
        }
        try {
            return ExampleEnum.valueOf(input.toUpperCase());
        } catch (IllegalArgumentException e) {
            // 这里可以根据业务需求抛出自定义异常,或者返回默认值
            throw new IllegalArgumentException("无效的ExampleEnum参数值: " + input);
        }
    }
}

然后修改接口的参数处理:

@GetMapping("/example")
public List<Example> getByEnum(@RequestParam(name = "exampleEnum", required = false) String enumStr) {
    ExampleEnum exampleEnum = ExampleEnum.fromString(enumStr);
    // 业务代码
}

这种方式最灵活,你可以在静态方法里添加各种自定义逻辑,比如处理特殊的参数值。

补充:关于Jackson配置的提醒

如果是JSON请求体里的枚举需要忽略大小写,可以通过配置Jackson来实现,但这个配置对URL查询参数无效,所以这里顺便提一下:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 开启枚举忽略大小写反序列化
        mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
        return mapper;
    }
}

内容的提问来源于stack exchange,提问作者Justinas Jakavonis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:11:15