gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:36 28 4
gpt4 key购买 nike

我有一个发出简单 GET 请求的 JAX-RS 客户端。我正在为 DI 使用 CXF 实现和 Spring。调用成功,我收到 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”的 boolean 字段,但它在 POJO 中被称为“isActive”。一旦我添加了注释 @JsonProperty("active") 到 POJO 中的字段,它开始工作正常

最佳答案

AFAIK CXF 确实 not support autodiscovery MessageBodyReader 类。但是手动注册 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);

关于java - 如何为 cxf jax-rs 2.0 客户端注册 jackson json 提供程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30132336/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com