Spring中RestController如何通过简洁方式实现枚举与指定字符串的自定义转换?
搞定Spring MVC枚举自定义字符串转换的极简方案
太懂你这种反感繁琐配置的心态了——不就是个枚举和自定义字符串的转换嘛,为啥要写一堆配置类、在N个地方注册?其实真的有个超简单的办法,两步就能搞定,完全符合你想要的“重写/实现某个方法替换默认逻辑”的预期:
第一步:给枚举加个Getter
首先得把你枚举里的name字段暴露出来,不然转换器拿不到:
public enum MyEnum { PROPERTY_A("foo"), PROPERTY_B("bar"); private String name; MyEnum(String name) { this.name = name; } // 新增这个公开的getter方法 public String getName() { return name; } }
第二步:写个自定义转换器并让Spring自动接管
写一个实现Converter<String, MyEnum>的类,直接用@Component让Spring自动扫描注册,不用额外配置任何东西:
import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; @Component public class MyEnumConverter implements Converter<String, MyEnum> { @Override public MyEnum convert(String inputStr) { // 遍历枚举值匹配自定义的name for (MyEnum enumVal : MyEnum.values()) { if (enumVal.getName().equals(inputStr)) { return enumVal; } } // 匹配失败抛异常,Spring会自动返回400 Bad Request给前端 throw new IllegalArgumentException("无效的枚举参数: " + inputStr); } }
就这么简单!Spring会自动把这个转换器加入到它的全局转换服务里,以后你的@RequestParam MyEnum myEnum就能自动把"foo"转成PROPERTY_A,"bar"转成PROPERTY_B了,完全不用在Controller或者其他配置文件里写额外代码。
要是你不想用组件扫描,也可以在配置类里手动声明这个Bean:
@Configuration public class WebConfig { @Bean public MyEnumConverter myEnumConverter() { return new MyEnumConverter(); } }
这种方案比那些需要配置WebMvcConfigurer、重写addFormatters或者手动注册ConversionService的方式简洁太多,完美解决你不想在多个地方写注册代码的痛点。
内容的提问来源于stack exchange,提问作者David S
相关产品推荐
相关产品推荐

