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);
}
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>
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.
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 !!
Client client = ClientBuilder.newBuilder().register(ResteasyJacksonProvider.class).build();
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.
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();
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).
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.