如何为cxf jax-rs 2.0客户端注册jackson json提供程序?

时间:2015-05-08 20:27:12

标签: java rest jackson cxf jax-rs

我有一个正在发出简单GET请求的JAX-RS客户端。我正在使用CXF实现和Spring for DI。呼叫成功,我得到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

我的类路径中的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”的布尔字段,但它在POJO中被称为“isActive”。一旦我添加了注释@JsonProperty("active")到POJO中的字段,它开始正常工作

1 个答案:

答案 0 :(得分:11)

AFAIK CXF执行MessageBodyReaderJacksonJsonProvider个类。但是手动注册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); 应该适合您。

请检查效果非常好的not support autodiscovery。它与您的几乎完全相同,我只是使用了不同的服务。也许你可以发现阻止你的版本正常工作的差异。

#circle_menu1:hover, #circle_menu2:hover,#circle_menu3:hover,#circle_menu4:hover{
    -webkit-transform:scale(1.5);
    -webkit-box-shadow: 0 0 20px black;
}