如何设置属性顺序?
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
这里列出了我能想到的原因,为什么它 不会 起作用。首先请记住,上面提到的模块带有两个不同的提供程序,JacksonJsonProvider
和 JacksonJaxbJsonProvider
。我希望您能根据名称猜出哪一个提供了 JAXB 注释支持。
您明确注册了JacksonJsonProvider
您正在使用类路径扫描,这将注册两个提供程序,并且在请求期间,使用 JacksonJsonProvider
。请记住类路径扫描和包扫描是不同的。可以使用空的 Application
子类
启用类路径扫描
@ApplicationPath("/api")
public class AppConfig extends Application {}
您可以在类路径上 jersey-media-moxy
,这是默认提供程序,除非禁用,否则将在 jersey-media-json-jackson
提供程序上使用。
一些可能有用的注意事项
如果您使用的是 Jersey 2.9+,只要在类路径中包含 jersey-media-json-jackson:2.9+
,应该会自动注册使用 JacksonJaxbJsonProvider
的 JacksonFeature
。版本 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>
希望这能为您提供足够的信息来解决问题。
我用 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
这里列出了我能想到的原因,为什么它 不会 起作用。首先请记住,上面提到的模块带有两个不同的提供程序,JacksonJsonProvider
和 JacksonJaxbJsonProvider
。我希望您能根据名称猜出哪一个提供了 JAXB 注释支持。
您明确注册了
JacksonJsonProvider
您正在使用类路径扫描,这将注册两个提供程序,并且在请求期间,使用
启用类路径扫描JacksonJsonProvider
。请记住类路径扫描和包扫描是不同的。可以使用空的Application
子类@ApplicationPath("/api") public class AppConfig extends Application {}
您可以在类路径上
jersey-media-moxy
,这是默认提供程序,除非禁用,否则将在jersey-media-json-jackson
提供程序上使用。
一些可能有用的注意事项
如果您使用的是 Jersey 2.9+,只要在类路径中包含
中显式注册jersey-media-json-jackson:2.9+
,应该会自动注册使用JacksonJaxbJsonProvider
的JacksonFeature
。版本 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>
希望这能为您提供足够的信息来解决问题。