如何设置属性顺序?

How to set a properties order?

我用 Jersey 创建了一个简单的 RESTful API 服务,returns 一个 JSON 给用户。

但问题是 JSON 格式不正确。我要

{
  "x" : 1,
  "y" : 2,
  "result" : 3
}

但是得到

{
  "x" : 1,
  "result" : 3,
  "y" : 2
}

这是我的 DTO

@XmlRootElement(name = "result")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"x", "y", "res"})
public class Result {
    private Long x;
    private Long y;
    private Long res;
    // getters/setters ommited
}

如何在 JSON 响应中设置正确的顺序?

所以 @XmlType.propOrder 应该@JsonPropertyOrder 一样工作(由我自己测试,并且如前所述 here and here, given 提供程序上启用了 JAXB 注释支持。

[barbara - from comment]: Fasterxml Jackson, jersey-media-json-jackson

这里列出了我能想到的原因,为什么它 不会 起作用。首先请记住,上面提到的模块带有两个不同的提供程序,JacksonJsonProviderJacksonJaxbJsonProvider。我希望您能根据名称猜出哪一个提供了 JAXB 注释支持。

  1. 您明确注册了JacksonJsonProvider

  2. 您正在使用类路径扫描,这将注册两个提供程序,并且在请求期间,使用 JacksonJsonProvider。请记住类路径扫描和包扫描是不同的。可以使用空的 Application 子类

    启用类路径扫描
    @ApplicationPath("/api")
    public class AppConfig extends Application {}
    
  3. 您可以在类路径上 jersey-media-moxy,这是默认提供程序,除非禁用,否则将在 jersey-media-json-jackson 提供程序上使用。

一些可能有用的注意事项

  • 如果您使用的是 Jersey 2.9+,只要在类路径中包含 jersey-media-json-jackson:2.9+,应该会自动注册使用 JacksonJaxbJsonProviderJacksonFeature。版本 2.8-,您可以在 ResourceConfig

    中显式注册 JacksonFeature
    public class AppConfig extends ResourceConfig {
        public AppConfig() {
            packages("packages.to.scan");
            register(JacksonFeature.class);
        }
    }
    

    或者如果您使用的是 web.xml,请将该功能设置为 Jersey servlet 的初始参数

    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param.value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
    </init-param>
    

希望这能为您提供足够的信息来解决问题。