22

我正在使用带有杰克逊提供者的 RestEasy 客户端并收到上述错误

客户端代码是:

ClientRequest request = new ClientRequest(url);
request.accept(MediaType.APPLICATION_JSON);
ClientResponse<String> response = request.get(String.class);

if (response.getStatus() != 200) {
  throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
}

BufferedReader br =
  new BufferedReader(new InputStreamReader(new ByteArrayInputStream(response.getEntity().getBytes())));

response.getEntity()正在抛出ClientResponseFailure异常,错误为

Unable to find a MessageBodyReader of content-type application/json and type class java.lang.String

我的服务器端代码如下:

@GET
@Path("/{itemId}")
@Produces(MediaType.APPLICATION_JSON)
public String item(@PathParam("itemId") String itemId) {
  //custom code

  return gson.toJSON(object);
}
4

8 回答 8

58

您可以尝试将以下依赖项添加到您的 maven pom.xml 中。

   <dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson-provider</artifactId>
    <version>2.3.4.Final</version>
   </dependency>
于 2012-12-06T14:28:59.690 回答
8

问题实际上是 RestEasy 无法找到 Jackson 提供程序。我必须通过以下代码手动注册它:

   ResteasyProviderFactory instance=ResteasyProviderFactory.getInstance();
    RegisterBuiltin.register(instance);
    instance.registerProvider(ResteasyJacksonProvider.class);

一切正常。但我仍然对解决方案不满意,因为 Resteasy 应该扫描提供者并自动注册它们。

于 2012-08-30T10:54:49.350 回答
5
Client client = ClientBuilder.newBuilder().register(ResteasyJacksonProvider.class).build();
于 2018-08-14T12:04:50.077 回答
2

只需将org.jboss.resteasy.plugins.providers.jackson.ResteasyJacksonProvider行添加到 META-INF/services/javax.ws.rs.ext.Providers 文件中,即可解决问题。

此文件包含在 resteasy-jackson-providers.jar 中,但同一个文件也包含在另一个 jar 中,restasy-jaxrs.jar 并且对于使用这两个 jar 的可执行 jar 文件,它们不会合并!

于 2016-11-07T10:12:49.677 回答
1

我有一个类似的问题,我意识到这个问题与resteasy-jackson-provider. 我刚从3.0.4.Finalto移动3.0.5.Final,问题就消失了。

此外,我还意识到,如果我将第三行更改为以下结果,则结果是预期的,无需更改依赖项。

Response response = request.get(Object.class).toString();
于 2017-05-29T09:26:19.497 回答
1

使我的代码工作的东西是我添加的:

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson2-provider</artifactId>
    <version>&{resteasy.version}</version>
</dependency>

除此之外,我不知道为什么,但似乎 resteasy 在创建客户端时没有初始化提供程序,这意味着它需要手动初始化它们:

 ResteasyProviderFactory instance=ResteasyProviderFactory.getInstance();
 RegisterBuiltin.register(instance);
 instance.registerProvider(ResteasyJackson2Provider.class);

一般来说,运行客户端就足够了。

于 2018-02-07T07:20:32.963 回答
0

我不知道这背后的全部理由,但我们遇到了完全相同的问题(多次:P),您需要将 MediaType 更改为TEXT_PLAIN.

或者您也可以让 JAX-RS 为您完成这项工作:而不是执行 gson.toJSON(object),只需返回 object 并将您的方法签名更改为任何类。JAX-RS(在您的情况下为 RESTEasy)将自动调用 Jackson(如果配置正确)并将您的对象序列化为 json。然后在您的客户端,您将请求同一个类而不是 String,并且一切都应该独立运行。我对 ClientRequest/Response 不是特别熟悉,所以它可能不像我说的那样工作;我们改为在客户端使用 RESTEasy 代理功能(请参阅 参考资料ProxyFactory)。尽管如此,JAX-RS/RESTEasy 也可以在客户端自动进行 json 序列化/反序列化,所以肯定有一种方法。

于 2012-08-29T17:55:53.737 回答
0

如果您真的想绕过实际为您进行序列化的 JAX-RS 的优点(而不是手动调用 GSON),请使用StreamingOutput(即,将输出器包装为StreamingOutput,返回该对象)。

于 2012-08-29T18:56:15.877 回答