无法找到的内容类型的应用程序/ JSON和类型java.lang.String类的化MessageB

2019-06-27 13:14发布

我使用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);
}

Answer 1:

你可以尝试以下的依赖添加到您的Maven POM文件。

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


Answer 2:

这个问题实际上是RestEasy的是无法找到杰克逊提供商。 我不得不通过下面的代码来手动注册:

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

一切工作正常与此有关。 但我还是不满意的解决方案为RestEasy的应该是扫描的供应商,并自动注册。



Answer 3:

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


Answer 4:

只需添加一行org.jboss.resteasy.plugins.providers.jackson.ResteasyJacksonProvider到META-INF /服务/ javax.ws.rs.ext.Providers文件,解决了这个问题。

此文件纳入RestEasy的杰克逊 - providers.jar但相同的文件还包括到另一个罐子,restasy-jaxrs.jar和可执行的JAR文件,使用这两个罐子,他们不合并!



Answer 5:

那些使事情的工作我的代码是,我说:

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

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



Answer 6:

我不知道背后的完整理由,但我们已经打了完全相同的问题(多次:P),你需要改变的MediaType到TEXT_PLAIN

或者你也可以让JAX-RS为你做这项工作:而不是做gson.toJSON(对象),简单地返回对象,并改变你的方法签名到任何类,它是。 JAX-RS(在你的案件的RESTEasy)会自动调用杰克逊(如果它的正确配置)和序列化你的对象到JSON。 然后在您的客户端,你会请求同一类,而不是字符串,一切都应该对自己的工作。 我不是特别熟悉的ClientRequest /响应所以我说,这可能无法正常工作; 我们使用的RESTEasy代理功能的客户端,而不是(见ProxyFactory )。 然而,JAX-RS /的RESTEasy可以做的JSON序列化/客户端上的自动并行化也因此有definetly的一种方式。



Answer 7:

如果你真的想通过通JAX-RS的善良实际上为你做的序列化(而不是手动调用GSON),使用StreamingOutput (即包输出器作为StreamingOutput ,返回该对象)。



Answer 8:

我有一个类似的问题,我意识到问题与版本相关resteasy-jackson-provider 。 我刚刚从移动3.0.4.Final3.0.5.Final和问题就消失了。

另外我也意识到,如果我改变了三线以下的结果预期,没有必要改变依赖。

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


文章来源: Unable to find a MessageBodyReader of content-type application/json and type class java.lang.String