web-dev-qa-db-de.com

Ein MessageBodyReader des Inhaltstyps application/json und der Typklasse Java.lang.String konnte nicht gefunden werden

Ich verwende den RestEasy-Client mit den Jackson-Providern und erhalte den obigen Fehler

kundenseitiger Code lautet: 

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() löst ClientResponseFailure-Exception mit dem Fehler aus

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

Mein serverseitiger Code ist unten:

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

  return gson.toJSON(object);
}
20
user1632803

Sie könnten versuchen, Ihrem Maven Pom die folgende Abhängigkeit hinzuzufügen.

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

Das Problem ist eigentlich, dass RestEasy den Jackson-Anbieter nicht finden kann. Ich musste es manuell mit dem folgenden Code registrieren:

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

Alles funktioniert gut damit. Aber ich bin immer noch nicht zufrieden mit der Lösung, da Resteasy nach den Providern suchen und diese automatisch registrieren soll.

7
user1632803

Durch das Hinzufügen der Zeile org.jboss.resteasy.plugins.providers.jackson.ResteasyJacksonProvider in die Datei META-INF/services/javax.ws.rs.ext.Providers wird das Problem gelöst.

Diese Datei ist in resteasy-jackson-provider.jar enthalten, aber dieselbe Datei ist auch in einem anderen jar, restasy-jaxrs.jar, enthalten. Bei einer ausführbaren JAR-Datei, die beide Jars verwendet, werden sie nicht zusammengeführt !!

1
MatteoM
Client client = ClientBuilder.newBuilder().register(ResteasyJacksonProvider.class).build();
1
Bruno Horta

Dinge, die zu meinem Code gemacht hatten, waren, dass ich hinzugefügt habe:

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

Abgesehen davon weiß ich nicht warum, aber es scheint so, als würden die Anbieter beim Erstellen des Clients nicht initialisiert. Dies bedeutet, dass sie manuell initiiert werden mussten: 

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

Im Allgemeinen reicht es aus, den Client auszuführen. 

0
Dmitry Svn

Ich hatte ein ähnliches Problem und erkannte, dass das Problem mit der Version von resteasy-jackson-provider zusammenhängt. Ich bin gerade von 3.0.4.Final zu 3.0.5.Final umgezogen und das Problem ist verschwunden.

Außerdem erkannte ich auch, dass, wenn ich die dritte Zeile auf die folgende Zeile ändere, das Ergebnis das erwartete war, ohne dass die Abhängigkeiten geändert werden mussten.

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

Wenn Sie wirklich wollen, dass JAX-RS tatsächlich die Serialisierung für Sie durchführt (anstatt GSON manuell aufzurufen), verwenden Sie StreamingOutput (d. H. Wrapping outputter als StreamingOutput, geben Sie dieses Objekt zurück).

0
StaxMan

Ich weiß nicht, was dahinter steckt, aber wir haben genau dasselbe Problem (mehrmals: P) und Sie müssen den Medientyp in TEXT_PLAIN ändern.

Oder lassen Sie sich von JAX-RS die Arbeit erledigen: Anstatt gson.toJSON (object) auszuführen, geben Sie einfach object zurück und ändern Sie Ihre Methodensignatur in eine beliebige Klasse. JAX-RS (in Ihrem Fall RESTEasy) ruft automatisch Jackson an (sofern richtig konfiguriert) und serialisiert Ihr Objekt in json. Dann würden Sie auf Ihrer Clientseite dieselbe Klasse anstelle von String anfordern, und alles sollte für sich alleine funktionieren. Ich bin mit ClientRequest/Response nicht besonders vertraut, daher funktioniert es möglicherweise nicht wie gesagt. stattdessen verwenden wir auf der Clientseite die RESTEasy-Proxy-Funktionalität (siehe ProxyFactory). Trotzdem kann JAX-RS/RESTEasy json auch auf Clientseite automatisch serialisieren/deserialisieren, so dass es definitiv einen Weg gibt.

0
Pascal Gélinas