À 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;
}

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