我有一个正在执行简单GET请求的JAX-RS客户端。我正在使用CXF实现和Spring for DI。通话成功,我收到200的响应码。但是将响应读入我的POJO时出现错误。

异常(exception):

[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

我在类路径中的this answer中具有以下依赖关系,它似乎不会自动被获取。

    <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(JacsksonJsonProvider.class)可以注册json提供程序。问题出在数据上(就像上面的异常明确指出的那样。.我现在觉得很愚蠢:()。我在json中有一个名为“active”的 boolean 字段,但是在POJO中它被称为“isActive”。添加了注释@JsonProperty("active")到POJO中的字段,它开始正常工作

最佳答案

AFAIK CXF执行MessageBodyReader类的not support autodiscovery。但是,手动注册JacksonJsonProvider应该适合您。

请检查运作良好的my example。它几乎与您的完全一样,只是我使用了不同的服务。也许您会发现一个差异,导致您的版本无法正常工作。

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);

07-26 00:58