我试图从REST资源获取JSON数据,并使用JSON-to-Java绑定自动将其转换为Java Object。我在我的客户端应用程序中使用Jersey framework 2.21和jersey-media-moxy模块作为JSON提供程序。
我无法弄明白为什么当我这样做时,为什么我得到null而不是正确的Post对象:
Client client = ClientBuilder.newClient();
WebTarget webTarget = client.target("http://www.travelportland.com/wp-json");
Response response = webTarget.path("posts/9").request().get();
Post post = response.readEntity(Post.class); // => null
Post类实现看起来像这样(此时我只想从JSON中获取标题'字段):
@XmlRootElement
public class Post {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
当我尝试获取String时,一切正常:
String postStr = response.readEntity(String.class);
或者如果我尝试获得其他资源:
WebTarget webTarget = client.target("http://jsonplaceholder.typicode.com");
Response response = webTarget.path("posts/9").request().get();
Post post = response.readEntity(Post.class); // => com.example.Post@74e28667
似乎这个问题与JSON数据的结构或大小有某种关系。 我该如何解决这个问题?
答案 0 :(得分:2)
似乎是MOXy的一个问题。我不确定是什么(可能大小,坏的字符,我不知道)。但我和杰克逊一起测试过,它运行正常。如果你不能用MOXy解决问题,你可能只想制作杰克逊。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey2.version}</version>
</dependency>
如果您不是来自JSON的所有键的模型,则需要设置类注释以忽略未知属性
@XmlRootElement
@JsonIgnoreProperties(ignoreUnknown = true)
public class Post {
如果你已经使用了大量的JAXB注释,那么杰克逊也会识别它们。
还要确保摆脱MOXy依赖关系,必须使用JacksonFeature.class
显式注册Client
,以禁用MOXy提供程序。