如何为 cxf jax-rs 2.0 客户端注册 jackson json provider?

2022-09-04 21:09:10

我有一个 JAX-RS 客户端,它正在发出一个简单的 GET 请求。我正在使用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

在我的类路径中,我有以下依赖项,如这个答案中所建议的那样,它似乎没有被自动拾取。

    <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

更新:

使用 注册 json 提供程序工作正常。问题在于数据(就像上面的例外明确指出的那样。我现在觉得很傻:()。我在json中有名为“active”的布尔字段,但在POJO中它被称为“isActive”。一旦我将注释添加到POJO中的字段,它就开始正常工作ClientBuilder.newClient().register(JacsksonJsonProvider.class)@JsonProperty("active")


答案 1

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

答案 2