为什么response.readEntity(Post.class)返回null?

时间:2015-08-19 14:11:00

标签: json rest jaxb jersey jax-rs

我试图从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数据的结构或大小有某种关系。 我该如何解决这个问题?

1 个答案:

答案 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提供程序。