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

use*_*803 20 rest json jax-rs resteasy jackson

我正在使用带有jackson提供程序的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())));
Run Code Online (Sandbox Code Playgroud)

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

Unable to find a MessageBodyReader of content-type application/json and type class java.lang.String
Run Code Online (Sandbox Code Playgroud)

我的服务器端代码如下:

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

  return gson.toJSON(object);
}
Run Code Online (Sandbox Code Playgroud)

小智 53

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

   <dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson-provider</artifactId>
    <version>2.3.4.Final</version>
   </dependency>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,resteasy-jackson-provider [似乎已弃用](http://docs.jboss.org/resteasy/docs/3.1.0.Final/javadocs/org/jboss/resteasy/plugins/providers/jackson/ResteasyJacksonProvider.html)而 resteasy-jackson2-provider 是新的神器。 (4认同)

use*_*803 7

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

   ResteasyProviderFactory instance=ResteasyProviderFactory.getInstance();
    RegisterBuiltin.register(instance);
    instance.registerProvider(ResteasyJacksonProvider.class);
Run Code Online (Sandbox Code Playgroud)

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


小智 5

Client client = ClientBuilder.newBuilder().register(ResteasyJacksonProvider.class).build();
Run Code Online (Sandbox Code Playgroud)


Pas*_*nas 0

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

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