如何为CXF JAX-RS 2.0客户端注册Jackson JSON提供程序?

13

我有一个使用CXF实现和Spring进行依赖注入的JAX-RS客户端正在进行简单的GET请求。调用成功,我收到了返回码200的响应。但是,在将响应读取到我的POJO时出现了错误。

异常:

[2015-05-08 16:11:55,457][ERROR][org.apache.cxf.jaxrs.utils.JAXRSUtils]: No message body reader has been found for class com.voya.refapp.domain.Customer, ContentType: application/json
[2015-05-08 16:11:55,468][ERROR][com.voya.refapp.service.CustomerServiceImpl]: filterByName() - Exception occurred
javax.ws.rs.client.ResponseProcessingException: No message body reader has been found for class com.voya.refapp.domain.Customer, ContentType: application/json
    at org.apache.cxf.jaxrs.impl.ResponseImpl.reportMessageHandlerProblem(ResponseImpl.java:433) ~[cxf-rt-frontend-jaxrs-3.0.4.jar:3.0.4]
    at org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:384) ~[cxf-rt-frontend-jaxrs-3.0.4.jar:3.0.4]

代码:

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/rest").path("customers/1");
Invocation.Builder builder = target.request(MediaType.APPLICATION_JSON_TYPE);
Response response = builder.get();  // Successful
Customer customer = response.readEntity(Customer.class);  // Fails

我在classpath中有以下依赖项,正如这个答案中建议的那样,它似乎没有被自动选择。

    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
    </dependency>

我在创建客户端时尝试注册JSON提供程序:

Client client = ClientBuilder.newClient().register(new JacsksonJsonProvider());

Client client = ClientBuilder.newClient().register(JacsksonJsonProvider.class);

但是这些选项都没有起作用。当我使用上述任一选项注册JSON提供程序时,会出现不同的异常:

javax.ws.rs.client.ResponseProcessingException: Problem with reading the data

更新:

使用ClientBuilder.newClient().register(JacksonJsonProvider.class)成功注册了json提供程序。问题在于数据(正如上面的异常清楚地说明的那样...我现在感到有点愚蠢:()。JSON中有一个名为“active”的布尔字段,但在POJO中它被称为“isActive”。一旦我在POJO中的该字段上添加了@JsonProperty("active")注释,它就开始正常工作了。

1个回答

14
据我所知,CXF不支持自动发现MessageBodyReader类(不支持自动发现)。但是手动注册JacksonJsonProvider应该可以解决问题。
请检查我的示例,它完美地运行。它几乎与您的代码完全相同,只是使用了不同的服务。也许您可以发现一个阻止您的版本正常工作的差异。
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class);
WebTarget target = client.target("http://jsonplaceholder.typicode.com").path("posts/1");
Invocation.Builder builder = target.request(MediaType.APPLICATION_JSON_TYPE);
Response response = builder.get();  // Successful
Post post = response.readEntity(Post.class);

1
谢谢您的回复,Dawid。就像您所说的,我和您的代码一样,但问题是由于JSON中的布尔字段引起的。它在JSON中被命名为“active”,但在POJO中为“isActive”。一旦我在POJO的字段上添加了@JsonProperty(“active”),它就开始正常工作了。 - Anand Jayabalan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接