web-dev-qa-db-fra.com

SEVERE: MessageBodyWriter introuvable pour le type de média = application / json, type = classe com.jersey.jaxb.Todo, genericType = classe com.jersey.jaxb.Todo

J'essaie de créer un service Web RESTful et j'en ai créé un, mais je reçois un

MessageBodyWriter introuvable pour le type de support = erreur application/json

Ma classe Todo:

package com.jersey.jaxb;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.pojomatic.Pojomatic;
import org.pojomatic.annotations.AutoProperty;

@XmlRootElement
@XmlType(name = "todo")
@XmlAccessorType(XmlAccessType.FIELD)
@AutoProperty
public class Todo {

    @XmlElement(name = "summary")
    private final String summary;

    @XmlElement(name = "description")
    private final String description;

    public String getSummary() {
        return summary;
    }

    public String getDescription() {
        return description;
    }

    public Todo() {
        this(new Builder());    
    }

    public Todo(Builder builder) {
        this.summary = builder.summary;
        this.description = builder.description;
    }

    @Override
    public boolean equals(Object o) {
        return Pojomatic.equals(this, o);
    }

    @Override
    public int hashCode() {
        return Pojomatic.hashCode(this);
    }

    @Override
    public String toString() {
        return Pojomatic.toString(this);
    }

    public static class Builder {
        private String description;
        private String summary;

        public Builder summary(String summary) {
            this.summary = summary;
            return this;
        }

        public Builder description(String description) {
            this.description = description;
            return this;
        }

        public Todo build() {
            return new Todo(this);
        }
    }
}

Et ma ressource: -

package com.jersey.jaxb;

import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

@Path("/todo")
public class TodoResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getTodo(){
        Todo todo = new Todo.Builder().description("My Todo Object").summary("Created").build();
        return Response.status(Status.OK).entity(todo).build();
    }

}

Mon web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns="http://Java.Sun.com/xml/ns/javaee" xmlns:web="http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<display-name>MyFirstWebService</display-name>
<servlet>
  <servlet-name>Jersey REST Service</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
   <init-param>
     <param-name>jersey.config.server.provider.packages</param-name>
     <param-value>com.jersey.jaxb</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>Jersey REST Service</servlet-name>
  <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

</web-app>  

Mes bibliothèques:

aopalliance-repackaged-2.4.0-b10.jar
asm-debug-all-5.0.2.jar
hk2-api-2.4.0-b10.jar
hk2-locator-2.4.0-b10.jar
hk2-utils-2.4.0-b10.jar
jackson-jaxrs-json-provider-2.2.3.jar
javassist-3.18.1-GA.jar
javax.annotation-api-1.2.jar
javax.inject-2.4.0-b10.jar
javax.servlet-api-3.0.1.jar
javax.ws.rs-api-2.0.1.jar
jaxb-api-2.2.7.jar
jersey-client.jar
jersey-common.jar
jersey-container-servlet.jar
jersey-container-servlet-core.jar
jersey-guava-2.17.jar
jersey-media-jaxb.jar
jersey-server.jar
org.osgi.core-4.2.0.jar
osgi-resource-locator-1.0.1.jar
persistence-api-1.0.jar
validation-api-1.1.0.Final.jar

Lorsque j'exécute cette application sur le serveur Tomcat et que j'exécute ceci: http: // localhost: 8080/MyFirstWebService/rest/todo

Je reçois l'erreur:

SEVERE: MessageBodyWriter introuvable pour le type de média = application/json, type = classe com.jersey.jaxb.Todo, genericType = classe com.jersey.jaxb.Todo.

31
Raj Hassani

Tu as jackson-jaxrs-json-provider qui est un début ..

Mais ...

cet artefact dépend toujours de Jacskon lui-même, qui comprend tous ces artefacts

enter image description here

C'est pourquoi nous utilisons Maven[ 1 ] (donc on n'a pas à s'inquiéter de ce genre de chose :-). Alors allez les chercher.

Ensuite, ajoutez simplement le paquet au fichier web.xml, et cela devrait fonctionner

<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
    com.jersey.jaxb,
    com.fasterxml.jackson.jaxrs.json
</param-value>

1. Dépendance Maven

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.2.3</version>
</dependency>

Ou utilisez le "wrapper" de Jersey ci-dessous pour la dépendance ci-dessus. Il enregistrera les fournisseurs Jackson (nous n'avons donc pas besoin de s'enregistrer explicitement comme ci-dessus), et les mappeurs d'exceptions Jackson, à partir de la version 2.17, prennent en charge Entity Data Filtering .

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey2.version}</version>
</dependency>

Remarque: Le fait de ne pas avoir à enregistrer quoi que ce soit avec la dépendance ci-dessus est rendu possible par le biais de la fonction détection automatique de Jersey. Si, pour une raison quelconque, nous désactivons la détection automatique, vous souhaiterez enregistrer explicitement le JacksonFeature.

49
Paul Samsotha

La solution peut être de s'assurer que les classes de modèle ont un constructeur sans argument.

Et ajoutez cette dépendance à votre pom.XML:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
</dependency>
18
Milson

J'ai eu le même problème, je l'ai résolu en ajoutant un constructeur vide à la classe

public SandBoxClass(){} //-> solved the issue**

public SandBoxClass(Integer arg1, Integer arg2) {
        this.arg1=arg1;
        this.arg2=arg2;
}
8
zelli79

Si vous avez déjà ajouté la dépendance jersey-media-moxy dans votre pom.xml. Assurez-vous que votre classe d'entité possède le constructeur par défaut. J'ai eu ce problème lorsque j'ai introduit un constructeur paramatrizé dans la classe de modèle. L'ajout du constructeur par défaut a de nouveau fonctionné pour moi.

3
Chandan Kumar
  1. Bibliothèque de mises à jour Jax-RS 2.0 et Jersey 2.5.1 (JAX-RS-RI) uniquement
  2. La réponse de l'objet bean (todo) n'est pas renvoyée car lors de la génération automatique de json ou xml, elle crée un problème.
0
Vimalesh Valiya