如何设置属性订单?

时间:2015-04-09 15:21:05

标签: java json jersey

我使用Jersey创建了一个简单的RESTful API服务,它向用户返回一个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响应中设置正确的顺序?

1 个答案:

答案 0 :(得分:1)

因此@XmlType.propOrder 应该像@JsonPropertyOrder一样工作(由我自己测试,如上所述[{3}}和here给定在提供程序上启用了JAXB注释支持。

  

[barbara - 来自评论]: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提供商上使用。

  4. 有些注意事项可能会有所帮助

    • 如果您使用的是Jersey 2.9+,只需在类路径上使用jersey-media-json-jackson:2.9+,就应该自动注册使用JacksonFeature的{​​{1}}。版本2.8-,您可以在JacksonJaxbJsonProvider

      中明确注册JacksonFeature
      ResourceConfig

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

      public class AppConfig extends ResourceConfig {
          public AppConfig() {
              packages("packages.to.scan");
              register(JacksonFeature.class);
          }
      }
      

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