无法找到内容类型application / json的MessageBodyReader并键入类java.lang.String

时间:2012-08-29 10:10:37

标签: json rest jax-rs jackson resteasy

我正在使用带杰克逊提供商的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);
}

8 个答案:

答案 0 :(得分:53)

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

   <dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson-provider</artifactId>
    <version>2.3.4.Final</version>
   </dependency>

答案 1 :(得分:7)

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

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

这一切都很好。但我对解决方案仍然不满意,因为Resteasy应该扫描提供商并自动注册。

答案 2 :(得分:2)

Client client = ClientBuilder.newBuilder().register(ResteasyJacksonProvider.class).build();

答案 3 :(得分:1)

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

此文件包含在resteasy-jackson-providers.jar中,但同样的文件也包含在另一个jar,restasy-jaxrs.jar和可执行jar文件中,使用这两个jar,它们没有合并!! < / p>

答案 4 :(得分:1)

使我的代码成功的事情是我添加的:

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

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

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

一般来说,它足以运行客户端。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我有类似的问题,我意识到问题与resteasy-jackson-provider的版本有关。我刚刚从3.0.4.Final移到3.0.5.Final,问题就消失了。

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

Response response = request.get(Object.class).toString();