Spring Boot中如何通过自定义注解实现String转Enum类型
实现自定义注解完成字符串到枚举的大小写兼容转换
1. 定义自定义注解@ConvertToEnum
创建用于标记需要进行枚举转换的字段注解:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ConvertToEnum { }
2. 实现大小写不敏感的枚举反序列化器
编写Jackson反序列化器,处理任意大小写字符串到枚举的转换逻辑:
public class CaseInsensitiveEnumDeserializer extends StdDeserializer<Enum<?>> { private final Class<? extends Enum<?>> enumClass; public CaseInsensitiveEnumDeserializer(Class<? extends Enum<?>> enumClass) { super(enumClass); this.enumClass = enumClass; } @Override public Enum<?> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String inputValue = p.getText().trim(); // 将输入字符串转为大写,匹配枚举常量名 return Enum.valueOf(enumClass, inputValue.toUpperCase()); } }
3. 关联注解与反序列化器
通过Jackson的BeanDeserializerModifier实现注解触发自定义反序列化的逻辑:
@JsonComponent public class ConvertToEnumModifier extends BeanDeserializerModifier { @Override public List<BeanPropertyModifier> updateProperties(DeserializationConfig config, BeanDescription beanDesc, List<BeanPropertyModifier> modifiers) { modifiers.add(new BeanPropertyModifier() { @Override public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanPropertyDefinition propDef, JsonDeserializer<?> deserializer) { // 检查字段是否标注了@ConvertToEnum if (propDef.getField().getAnnotation(ConvertToEnum.class) != null) { Class<?> fieldType = propDef.getType().getRawClass(); if (Enum.class.isAssignableFrom(fieldType)) { // 替换为自定义反序列化器 return new CaseInsensitiveEnumDeserializer((Class<? extends Enum<?>>) fieldType); } } return deserializer; } }); return super.updateProperties(config, beanDesc, modifiers); } }
4. 直接使用现有DTO与枚举
你的Type枚举和ProviderRequest无需额外修改,当请求体传入小写(如"type": "movie_capable")或混合大小写的字符串时,会自动转换为对应的枚举实例。
注意事项
- 该方案基于Jackson实现,适用于Spring Boot等默认使用Jackson处理请求体的项目
- 转换逻辑依赖枚举常量的大写命名,若枚举命名规则变更,需同步调整转换逻辑
- 支持所有枚举类型,只需在目标字段上标记
@ConvertToEnum注解即可
内容的提问来源于stack exchange,提问作者amin
相关产品推荐
相关产品推荐

