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

JsonPropertyOrder注解在JAX-RS Response中排序失效求助

解决JsonPropertyOrder在JAX-RS REST接口中不生效的问题

看起来你遇到的问题挺典型的——Jackson的排序注解在main方法里正常工作,但放到JAX-RS接口里就失效了。这大概率是因为你的JAX-RS框架(比如Jersey)没使用Jackson作为JSON序列化器,而是默认用了其他实现(比如MOXy、Jettison),这些序列化器根本不识别Jackson的@JsonPropertyOrder和@JsonProperty(index)注解。

下面是具体的解决步骤:

1. 引入Jackson-JAXRS JSON提供者依赖

如果用Maven管理项目,在pom.xml里添加以下依赖(版本可以根据你使用的Jackson版本调整):

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.15.2</version>
</dependency>

2. 让JAX-RS框架启用Jackson序列化

方式一:通过自定义Application类注册JacksonFeature

如果你的项目用了自定义的Application子类,直接在里面注册JacksonFeature:

import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.jackson.JacksonFeature;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;

@ApplicationPath("/api")
public class MyApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<>();
        classes.add(JacksonFeature.class);
        // 别忘了添加你的REST资源类
        classes.add(YourResourceClass.class);
        return classes;
    }
}

方式二:通过web.xml配置(传统Web项目)

如果是基于web.xml的项目,在Jersey的servlet配置里添加初始化参数:

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

3. 排除冲突的默认JSON提供者(可选)

如果你的项目里不小心引入了MOXy(Jersey默认的JSON提供者),可能需要排除它避免冲突。比如在Maven依赖里做排除操作:

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.35</version>
    <exclusions>
        <exclusion>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
        </exclusion>
    </exclusions>
</dependency>

验证配置

做完以上操作后重启服务,再调用/test/output接口,应该就能得到按name、id、version顺序排列的JSON响应了。

另外,你也可以手动配置ObjectMapper来强化排序逻辑(不过@JsonPropertyOrder本身已经能覆盖默认排序,这一步通常不需要):

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, false);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:57:40