À l'aide de Fournisseurs par défaut/MessageBodyWriters en Jersey 2
Juste de commencer Jersey, j'ai essayé de reproduire l'exemple simple de la dernière Jersey documentation"construction de réponses'. Cette partie, comme je le comprends, doit montrer comment Response
et ResponseBuilder
peut être utilisé pour retourner facilement une réponse en combinaison avec Entity<T>
pour le contenu de la réponse.
Maintenant, la documentation indique que plusieurs types de données sont par défaut pris en charge (ici: 'Les représentations et les types Java'). String
le premier d'entre eux, correspondant à tout type de support.
De toutes les variations que j'ai essayé, la suivante est plus simple:
@POST
public Response post() {
URI createdUri;
try {
createdUri = new URI("http://test.lan");
} catch (final URISyntaxException e) {
throw new WebApplicationException(e);
}
return Response.created(createdUri).entity(Entity.text("someContent")).build();
}
J'ai toujours eu le même message d'erreur (plein stacktrace ci-dessous) sur l'appel de la demande:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=text/plain, type=class javax.ws.rs.client.Entity, genericType=class javax.ws.rs.client.Entity.
Je crois que c'est en disant que la prestataire n'a pas été trouvé pour cette Entité générique. Cependant, la Chaîne doit être pris en charge OOTB?
J'ai trouvé que StringMessageProvider
est probablement le Maillot 1 de la mise en œuvre de ce fournisseur, et la plus classes associées, j'ai trouvé dans mon Maillot 2 bibliothèques arer les classes dans org.glassfish.jersey.message.internal
en jersey-commun. Parmi les nombreux fournisseurs il y a le StringMessageProvider
, qui m'apparaît comme un potentiel prévu fournisseur pour cela.
J'ai regardé l'émission, et tandis qu'il ya beaucoup de gens qui se présente lorsque tort d'essayer d'utiliser un Fournisseur personnalisé, je n'ai rien trouvé sur le défaut OOTB fournisseurs ne fonctionne pas..
J'ai vérifié mes libs, et maintenant j'ai les dépendances suivantes dans mon pom (parmi d'autres):
- jersey-conteneur de servlet-core
- jersey-client
- jersey-commune
- jersey-serveur
J'ai regardé en ligne, mais cela semble être tout ce dont j'ai besoin, mais je n'ai pas avec certitude trouvé le bon fournisseur de classes pour la Chaîne et JAXB/JSON dans les pots.
Contexte
- Projet Maven
- avec tomcat servlet-api 6.0.29
- La Version 2.6 de tout ce qui est mentionné jersey libs
- Eclipse kepler
- À l'aide de tomcat6 plugin maven pour exécuter tomcat intégré (fonctionne très bien jusqu'à présent)
Fiddler demande utilisé pour tester
POST HTTP/1.1
User-Agent: Fiddler
Host: 127.0.0.1
Content-Length: 0
Et de nouveau essayé plusieurs variantes.
Plein stacktrace
06-Jan-2015 21:13:54 org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
SEVERE: MessageBodyWriter not found for media type=text/plain, type=class javax.ws.rs.client.Entity, genericType=class javax.ws.rs.client.Entity.
06-Jan-2015 21:13:54 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet TestService threw exception
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=text/plain, type=class javax.ws.rs.client.Entity, genericType=class javax.ws.rs.client.Entity.
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:247)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:103)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:88)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1154)
at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:571)
at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:378)
at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:368)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:262)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:319)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:236)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:219)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)
MODIFIER
La même erreur (pour application/json) ocurs maintenant que j'ai une classe annotée avec @XmlRootElement
et essayer de le ramener dans une méthode pour le Maillot docs:
@GET
@Produces(MediaType.APPLICATION_JSON)
public Foo sampleFoo() {
Foo foo = new Foo();
return foo;
}
Où Foo
est annoté avec @XmlRootElement
.
J'ai aussi ajouté jersey-médias-json-jackson en tant que dépendance, je peux voir contient explicite JSONJaxb fournisseur. Cependant, il ne semble pas être ramassé quelque sorte.
OriginalL'auteur Mark Tielemans | 2015-01-06
Vous devez vous connecter pour publier un commentaire.
Première Question:
javax.ws.rs.client.L'entité
est un client à côté de la classe. JAX-RS spec ne dit rien à propos de son utilisation sur le côté serveur. Mais je peux confirmer avec beaucoup de différents tests, que le résultat sera similaire à ce que vous voyez (avec Jersey au moins). Avec Resteasy, il suffit d'envoyer laEntity.toString()
Depuis cela ne fonctionne pas, soit Resteasy ou le Jersey, je ne vais pas dire que c'est un bug, mais possible une erreur dans le Maillot de la documentation, qui exampled usage comme suit:
Ci-dessus a échoué pour moi aussi. Mais vous n'êtes pas tort de dire
comme ils sont. Pour obtenir votre exemple de travailler, il suffit de modifier le
Entity.text("someContent")
simplement"someContent"
Et juste pour être complet, côté client, l'utilisation de la pourrait ressembler à quelque chose comme
qui fonctionne très bien.
Deuxième Question:
Jusqu'à (je crois) Jersey 2.9, l'
jersey-media-json-jackson
module n'est pas auto-configuré. Donc, avec 2.6, nous avons besoin de définir la configuration soit par le biais de package d'analyse de laweb.xml
ou dans leApplication
sous-classe. De toute façon, unweb.xml
est nécessaire. Comme l'a déclaré ici en ce qui concerne l'2.x servlet de l'environnement, qui Tomcat 6.Donc à analyser pour le JSON classes de fournisseur, vous devez spécifier le package dans le
jersey.config.server.provider.packages
init-param. Un exemple web.xml serait quelque chose comme ceciVous êtes également autorisé à utiliser un
Application
sous-classe (quiResourceConfig
s'étend à partir de). Nous avons juste besoin de le spécifier dans laweb.xml
. Un exemple de configuration pourrait être quelque chose commeRemarque: Tout cela a été testé contre le même environnement, en plus de l'utilisation d'Eclipse. Je suis à l'aide de Netbeans, mais il ne devrait pas faire de différence. Aussi la seule dépendances Maven j'avais besoin étaient
Sur une autre note, pour simplifier le développement, je viens de créer un simple archétype Maven avec les coordonnées suivantes
Vous pouvez également voir La création d'un Nouveau Projet Maven Archetype
Testé et de travail! C'est la définitive d'abondance réponse à l'aide de Jersey sur Tomcat 6 (et donc de JDK 1.6). Je suis allé avec l'élégant web.xml solution de numérisation, mais j'ai peut-être besoin d'un
Application
classe plus tard. J'ai raté le fait queEntity
était un client du package de la classe. Obtenez-le maintenant tous, mais semble encore un peu bizarre et déroutant pour les débutants.Pour les futurs lecteurs: il suffit de garder à l'esprit qu'une fois que vous frappez Maillot de 2,9 et, le Jackson paquet est différent. Il n'est plus le codehaus de la dépendance, mais le fasterxml depencendy, qui est complètement différent. La nouvelle version, nous n'avons même pas besoin de mettre le paquet dans l'init-param. Il est automatiquement chargé 🙂 Juste un avis
OriginalL'auteur Paul Samsotha
Aussi loin que l'text/plain format, fait ce travail?
Pour la sortie JSON, j'ai ces dépendances
ainsi que d'un jaxb mise en œuvre. Toute volonté de le faire, j'utilise
J'ai également définir un objet mappeur de fournisseur, même si je ne suis pas sûr à 100% que c'est nécessaire (sauf si vous souhaitez personnaliser):
Aussi, je pense que vous devez vous inscrire à la Jackson fonctionnalité:
Je note que c'est tout configuré à l'aide de Jersey 2.11.
jackson-databind
artefact est disponible. Je ne pense pas que le jaxb impl dépendance est nécessaire, comme Jackson lui-même prévoit que. Cela ne résout pas mon problème, que je suis en utilisant Jersey 2.6 JDK 6 compatible.OriginalL'auteur Don Bottstein
Dans mon cas, j'ai ajouté le maillot-médias-json-jackson dépendance. Il a travaillé pour moi.
OriginalL'auteur Raghavendra b