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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:05:25