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 に追加してみてください。

   <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 に答える
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 に答える
0

(GSON を手動で呼び出す代わりに) JAX-RS が実際にシリアル化を行うという利点を本当に回避したい場合は、StreamingOutput(つまり、outputter を としてラップしStreamingOutput、そのオブジェクトを返す) を使用します。

于 2012-08-29T18:56:15.877 に答える
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 に答える