web-dev-qa-db-fra.com

Type de support Jersey + Json application/json introuvable

J'essaye avec l'exemple simple Jersey + JSON mais j'obtiens l'erreur suivante message body writer for Java class com.test.jsonexample and MIME media type application/json was not found

Je mets les fichiers jar suivants pour obtenir un résultat approprié 

asm-3.1.jar
jackson-core-asl-1.9.9.jar
jackson-jaxrs-1.9.9.jar
jackson-mapper-asl-1.9.9.jar
jackson-xc-1.9.9.jar
jersey-client-1.9.jar
jersey-core-1.9.1.jar
jersey-json-1.9.jar
jersey-server-1.9.1.jar
jettison-1.3.2.jar
jsr311-api-1.1.1.jar

Pourquoi est-ce que je reçois ce type d'erreur? Le journal des erreurs est ici:

SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.Sun.jersey.api.MessageException: A message body writer for Java class com.test.Jsonexample, and Java type class com.test.Jsonexample, and MIME media type application/json was not found
    at com.Sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.Java:285)
    at com.Sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.Java:1437)
    at com.Sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.Java:1349)
    at com.Sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.Java:1339)
    at com.Sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.Java:416)
    at com.Sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.Java:537)
    at com.Sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.Java:708)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:305)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:225)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:123)
    at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:472)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:168)
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:98)
    at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:927)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:407)
    at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1001)
    at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:579)
    at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:312)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at Java.lang.Thread.run(Unknown Source)

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://Java.Sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>TestJaxRs</display-name>

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>com.Sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.Sun.jersey.config.property.packages</param-name>
            <param-value>com.test.rest</param-value>
        </init-param>
        <init-param>
            <param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

</web-app>

JsonExample.Java

@XmlRootElement  
public class JsonExample {

    String title;
    String singer;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getSinger() {
        return singer;
    }

    public void setSinger(String singer) {
        this.singer = singer;
    }

    @Override
    public String toString() {
        return "JsonExample [title=" + title + ", singer=" + singer + "]";
    }

}

et le service Json 

@Path("/json/metallica")
public class JSONService {

    @GET
    @Path("/get")
    @Produces(MediaType.APPLICATION_JSON)
    public JsonExample getTrackInJSON() {

        JsonExample json = new JsonExample();
        json.setTitle("Enter Sandman");
        json.setSinger("Metallica");

        return json;

    }

    @POST
    @Path("/post")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createTrackInJSON(JsonExample track) {

        String result = "Track saved : " + track;
        return Response.status(201).entity(result).build();
    }

S'il vous plaît, suggérez-moi si je fais quelque chose de mal.

16
Ajay

Ce problème est résolu avec jersey-bundle-1.8.jar

13
Ajay

Correction du problème en ajoutant ce qui suit à mon pom.xml:

    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>0.99</version>
    </dependency>

La documentation peut être trouvée à: https://code.google.com/p/genson/

7
wingman88

Tout d’abord, si votre service Web @POST renvoie une réponse, vous devez ajouter une annotation @Produces.

Assurez-vous que jersey-json lib est dans votre chemin de classe . Essayez de supprimer la méthode toString() car elle risque de rompre le format de la structure de beans.

4
Alex Stybaev

Ajoutez la dépendance suivante pour résoudre le problème 

"javax.ws.rs.WebApplicationException: com.Sun.jersey.api.MessageException: A message body writer for Java class com.test.Jsonexample, and Java type class com.test.Jsonexample, and MIME media type application/json was not found
    at com.Sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.Java:285)"

Solution :

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.18</version>
</dependency>
3
Hari

Si vous n’êtes pas lié à Jackson, vous pouvez essayer la bibliothèque Genson http://owlike.github.io/genson/ . Vous n’avez besoin que de lib dans votre chemin de classe et tout devrait fonctionner sans code supplémentaire. Vous n'aurez même pas besoin d'utiliser POJOMappingFeature dans web.xml, ni d'ajouter @XMLRootElement sur votre pojo!

Vous pouvez également injecter des instances de Genson avec des configurations spécifiques à l'aide de mécanismes de jersey (ContextResolver).

3
eugen

Essayé avec 'com.Sun.jersey:jersey-bundle:1.19' et cela n'a pas résolu. 

La définition de la dépendance sur genson a été résolue pour moi. 

runtime(
        'com.owlike:genson:0.99'
)
3
dexter2305

J'ai passé littéralement 4 jours sur ce sujet et après avoir cherché sur Google pendant des heures et des heures, pourquoi mon POST ne fonctionnait pas du tout. Je recevais cette erreur ainsi que d'autres erreurs relatives à MOXY telles que classdefnotfound error, en raison de personnes sur stackoverflow suggérant d'utiliser MOXY à la place de Jackson. J'ai aussi essayé la bibliothèque Genson qui ne fournissait aucune différence. 

J'ai fini par enlever complètement MOXY et ne garder que Jackson. Après des heures, j'ai finalement trouvé la solution, ce qui m'a un peu énervé à cause de sa simplicité. Mon espace de travail est séparé en plusieurs projets différents, un pour l'application web contenant le fichier web.xml et un autre pour l'API RESTful.

J'utilise aussi Jersey 2, ce qui était un autre problème, car bon nombre des réponses acceptées à ce problème ne parlaient que de Jersey 1 et c'était très déroutant lorsque j'ai essayé de résoudre ce problème.

Après des heures et des heures d’essai, cela a fini par aboutir à ceci (en utilisant la structure de code qui a été publiée dans OP):

  1. Vous DEVEZ inclure @XmlRootElement en haut de votre classe POJO, contrairement à la plupart des exemples de stackoverflow qui semblent l’omettre.

  2. Vous DEVEZ inclure les éléments suivants dans le projet qui inclut votre fichier web.xml ainsi que dans le projet qui comprend votre service REST et les classes associées. Modifiez la version correspondant à la version de Jersey que vous utilisez.

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.5.1</version>
    </dependency>
    

C'est tout. Vous n'avez pas besoin d'inclure autre chose que cela et les bibliothèques Jersey appropriées que vous utilisez.

J'espère sérieusement que cela aidera quelqu'un d'autre à gagner du temps en essayant de résoudre ce problème. 

2
Toofy

J'ai eu le même problème et je l'ai corrigé en supprimant toutes les dépendances json et en ajoutant com.owlike genson 0,99

1
user1996855

Je sais que c’est une vieille question, mais j’ai découvert ces problèmes et j’ai essayé toutes les solutions ci-dessus, mais malheureusement, aucune d’entre elles ne m’a aidé. lors de la construction du bocal, il a fallu la classe définie dans l'autre classe (dans mon cas, le bocal glassfish) . Après avoir retiré l'autre bocal (vous pouvez également exclure la partie spécifique), le problème a été résolu.

1
Inbal

Lors de l'utilisation de jersey-bundle-1.19.1.jar (non-maven), j'ai dû supprimer ceci:

<init-param>
  <param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
  <param-value>true</param-value>
</init-param>

à partir du fichier web.xml. 

Je sais que la documentation suggère que cette section est nécessaire mais, étonnamment, c’est la raison du problème.

1
jakucki

Pour la nouvelle version de Maven, si vous avez des problèmes de dépendance, voici une bonne référence officielle: https://jersey.Java.net/documentation/latest/modules-and-dependencies.html#d0e383 ( Section 2.3.1, 2.3.2)

Et aussi voici un bon tutoriel pour installer maven et tuto de Jersey dans Eclipse: http://javaposts.wordpress.com/2012/01/14/maven-rest-jersey-Eclipse-tutorial/

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>
<!-- if you are using Jersey client specific features -->
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>
0
dellgg

J'ai essayé de télécharger les bibliothèques de jar suivantes:

Lorsque je télécharge gson 0.99, mon service de repos fonctionne bien.

0
jorge santos

Incluez ces dépendances dans votre fichier POM.xml et exécutez Maven -> Update

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
   <groupId>com.owlike</groupId>
   <artifactId>genson</artifactId>
   <version>0.99</version>
</dependency>
0
borchvm

Vérifiez également le paramètre de type actuel de la méthode post.

Ayant également gson comme dépendance, je devrais utiliser JSONObject (Jettison de Jersey-Json) au lieu de JsonObject (gson), ce qui a entraîné la même exception.

0
user2657714