Impossible de trouver un MessageBodyReader de type de contenu application/json et le type de classe java.lang.Chaîne
Je suis en utilisant RestEasy client avec jackson fournisseurs et d'obtenir l'erreur ci-dessus
infoclient code est:
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()
est en train de jeter ClientResponseFailure
exception avec l'erreur
Unable to find a MessageBodyReader of content-type application/json and type class java.lang.String
Mon côté serveur code est ci-dessous:
@GET
@Path("/{itemId}")
@Produces(MediaType.APPLICATION_JSON)
public String item(@PathParam("itemId") String itemId) {
//custom code
return gson.toJSON(object);
}
Vous devez vous connecter pour publier un commentaire.
Vous pourriez essayer d'ajouter ce qui suit à la dépendance à votre pom maven.
Le problème en fait est que RestEasy est impossible de trouver le Jackson fournisseur. J'ai eu à enregistrer manuellement par le code suivant:
Tout fonctionne bien avec cette. Mais je ne suis toujours pas satisfait de la solution que Resteasy est censé rechercher les fournisseurs et les enregistre automatiquement.
Tout en ajoutant la ligne org.jboss.resteasy.les plugins.les prestataires.jackson.ResteasyJacksonProvider dans META-INF/services/javax.ws.rs.ext.Les fournisseurs de fichier, résout le problème.
Ce fichier est inclus dans resteasy-jackson-providers.jar mais même fichier est également inclus dans un autre bocal, restasy-jaxrs.jar et pour un fichier jar exécutable, qui utilisent à la fois ces pots, ils ne sont pas fusionnées !!
Choses qui avaient fait le travail de mon code que j'ai ajouté:
À côté de cela, je ne sais pas pourquoi, mais il semble que resteasy pas l'initialisation des fournisseurs lors de la client ont été créés, ce qui signifie qu'il requis pour initialiser manuellement:
En général, il suffit d'exécuter le client.
Je ne sais pas la logique derrière cela, mais nous avons frappé exactement le même problème (plusieurs fois :P) et vous avez besoin de changer la MediaType à
TEXT_PLAIN
.Ou vous pouvez également laisser JAX-RS de faire le travail pour vous: au lieu de faire gson.la méthode toJSON(objet), il suffit de retourner l'objet et de modifier votre signature de la méthode de quelle que soit la classe. JAX-RS (RESTEasy dans votre cas) appelle automatiquement Jackson (si elle est correctement configuré) et sérialiser vos objet en json. Ensuite, sur votre côté client vous demande de cette même classe au lieu de String et tout devrait fonctionner sur son propre. Je ne suis pas particulièrement familier avec ClientRequest/Réponse, de sorte qu'il peut ne pas fonctionner comme je l'ai dit, nous utilisons RESTEasy la fonctionnalité proxy côté client à la place (voir
ProxyFactory
). Néanmoins, JAX-RS/RESTEasy peut faire json sérialiser/désérialiser automatiquement sur le côté client, donc il y a certainement un moyen.Si vous voulez vraiment de by-pass de la bonté de JAX-RS en train de faire de la sérialisation pour vous (au lieu de saisir manuellement l'appel de GSON), l'utilisation
StreamingOutput
(c'est à dire envelopper outputter commeStreamingOutput
, de retour de l'objet).J'ai eu un problème similaire et j'ai réalisé que le problème était lié à la version de
resteasy-jackson-provider
. Je viens d'emménager à3.0.4.Final
à3.0.5.Final
et le problème a disparu.De plus j'ai aussi réalisé que si je change la troisième ligne à la suivante, le résultat a été le prévoir, sans besoin de modifier les dépendances.