You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JAX-RS枚举不区分大小写反序列化问题咨询(含相关代码)

实现枚举的不区分大小写JSON反序列化

针对你的JAX-RS REST服务中枚举字段的不区分大小写反序列化需求,我会根据常用的JSON处理库给出两种主流解决方案:


一、如果使用Jackson作为JSON提供者(Jersey/RESTEasy默认常用)

Jackson是JAX-RS生态里最常用的JSON处理库,要实现枚举不区分大小写反序列化,有两种简单的方式:

1. 给枚举类添加Jackson注解

直接在你的枚举类上配置@JsonFormat,指定大小写不敏感即可:

import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(shape = JsonFormat.Shape.STRING, caseInsensitive = true)
public enum YourEnum {
    VALUE1, VALUE2, VALUE3;
}

这样Jackson在反序列化时会自动忽略大小写,比如传入"value1""VALUE1""Value1"都会映射到VALUE1。如果担心传入未知枚举值报错,还可以额外加上@JsonIgnoreProperties(ignoreUnknown = true)

2. 全局配置枚举反序列化规则

如果希望所有枚举都应用不区分大小写的规则,可以通过JAX-RS的Provider配置全局Jackson规则:

import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

@Provider
public class JacksonConfig implements ContextResolver<ObjectMapper> {
    private final ObjectMapper objectMapper;

    public JacksonConfig() {
        objectMapper = new ObjectMapper();
        // 开启全局枚举不区分大小写反序列化
        objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return objectMapper;
    }
}

将这个配置类注册到你的JAX-RS应用中,所有枚举的JSON反序列化都会自动忽略大小写。


二、如果使用MOXy作为JSON提供者(GlassFish默认)

如果你的项目使用EclipseLink MOXy作为JSON处理引擎(比如GlassFish服务器默认),可以通过自定义转换器实现:

1. 编写枚举转换器

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class CaseInsensitiveEnumAdapter<T extends Enum<T>> extends XmlAdapter<String, T> {
    private final Class<T> enumClass;

    public CaseInsensitiveEnumAdapter(Class<T> enumClass) {
        this.enumClass = enumClass;
    }

    @Override
    public T unmarshal(String value) throws Exception {
        if (value == null) {
            return null;
        }
        // 转成大写后匹配枚举(也可以转小写,根据你的枚举定义调整)
        return Enum.valueOf(enumClass, value.toUpperCase());
    }

    @Override
    public String marshal(T value) throws Exception {
        if (value == null) {
            return null;
        }
        return value.name();
    }
}

2. 在Update类的枚举字段上应用转换器

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlAccessorType(XmlAccessType.FIELD)
public class Update implements Serializable {
    // 假设你的枚举字段是yourEnum
    @XmlJavaTypeAdapter(value = CaseInsensitiveEnumAdapter.class, type = YourEnum.class)
    private YourEnum yourEnum;

    // 其他字段和方法...
}

这样MOXy在反序列化JSON时,会调用转换器把传入的字符串统一大小写后匹配枚举值,实现不区分大小写的效果。


补充说明

  • 优先推荐Jackson的方案,因为配置更简洁,且是当前JAX-RS生态的主流选择。
  • 如果不确定用的是哪个JSON提供者,可以查看项目依赖:包含jackson-jaxrs-json-provider依赖就是Jackson;包含eclipselink相关依赖则大概率是MOXy。

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

火山引擎 最新活动