55 votes

Le rédacteur du corps du message pour la classe Java n'a pas été trouvé

Je suis novice dans l'utilisation de JAX-RS et j'ai écrit un exemple d'application qui produit un objet json, mais je reçois une exception. Voici mon code :

@Path("/hello")
public class HelloWorldService {

    @GET
    @Path("/query/{artist_id}")
    @Produces("application/json")
    public Data getMsg(@PathParam("artist_id") int artist_id,
                            @QueryParam("from") int from,
                            @QueryParam("to") int to) {
        Data d=new Data();
        d.setName("Mateen");
        d.setRoll(77);
        return d;

    }

}

Mes données sont simplement une classe POJO :

@XmlRootElement
public class Data {
    private int roll;
    private String name;
    public int getRoll() {
        return roll;
    }
    public void setRoll(int roll) {
        this.roll = roll;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

J'obtiens une exception :

javax.ws.rs.WebApplicationException: 
    com.sun.jersey.api.MessageException: 
    A message body writer for Java class com.abc.data.Data, 
    and Java type class com.abc.data.Data, 
    and MIME media type application/json was not found

Qu'est-ce que je fais de travers ?

0 votes

[veuillez consulter cet article, vous devez enregistrer la capacité de Jersey à produire du JSON][1] [1] : stackoverflow.com/questions/5161466/

0 votes

0 votes

Pourquoi faut-il fournir @XmlRootElement sur le bean ?

100voto

user1730789 Points 1288

J'ai enfin trouvé ma réponse. J'ai ajouté

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.8</version>
</dependency>

dans mon fichier pom.xml. J'ai ensuite ajouté

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

à mon fichier web.xml, et tout fonctionne bien. Aucun changement n'a été nécessaire dans mon code ci-dessus.

3 votes

Merci, cela fonctionne pour moi. J'ai également trouvé la même chose sur le site officiel de Jersey. jersey.java.net/documentation/1.18/json.html (sections 5.1+5.2 au moins)

0 votes

J'aimerais savoir comment je peux écrire des lignes similaires dans le fichier "build.gradle" construit par Gradle, avec la même fonction que le pom.xml mentionné ci-dessus ? Mon projet est construit sur Gradle.

0 votes

Recommander d'utiliser <scope>runtime</scope> parce que le code n'est pas compilé en fonction de la norme jersey-json est utilisé au moment de l'exécution.

16voto

Ser Yoga Points 124

J'ai ajouté les bocaux suivants et cela a fonctionné pour moi

  • jackson-core-asl-1.9.2.jar
  • jackson-mapper-asl-1.9.2.jar
  • jackson-xc-1.9.2.jar
  • jackson-jaxrs-1.9.2.jar

13voto

Cyril Deba Points 603

Juste un petit ajout. Si vous n'utilisez pas le fichier descripteur web.xml, vous pouvez activer le POJOMappingFeatire par programme comme indiqué ci-dessous

...
final ResourceConfig rc = new PackagesResourceConfig("com.test.resources");
    final Map<String, Object> config = new HashMap<String, Object>();
    config.put("com.sun.jersey.api.json.POJOMappingFeature", true);
    rc.setPropertiesAndFeatures(config);
...

0 votes

stackoverflow.com/questions/17342218/ pouvez-vous résoudre ce problème ?

3 votes

Veuillez indiquer où exactement je dois ajouter les lignes de code ci-dessus ?

5voto

Deepak Mishra Points 1996

Utilisateur Maven : Vous n'avez besoin que des 2 dépendances suivantes.

<!-- For Jersey --> 
<dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.15</version>
</dependency>

<!-- For JSON --> 
<dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.15</version>    
</dependency>

La sortie XML est prise en charge par défaut. Aucune dépendance n'est donc nécessaire.

3voto

Aksh1801 Points 189

En travaillant avec Jersey 1.8, j'ai obtenu la même erreur en créant un objet JSON et en accédant à une API REST du côté client.

Si vous rencontrez un problème côté serveur, assurez-vous que vous avez correctement inclus jersey-json.jar dans le classpath et que vous avez mappé les paramètres init corrects dans le web.xml, comme indiqué dans d'autres réponses.

Côté client

Conformément à la Documentation de Jersey 1.8 L'extrait suivant montre comment utiliser la fonction de mappage POJO JSON du côté client :

 ClientConfig clientConfig = new DefaultClientConfig();
 clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,Boolean.TRUE);
 Client client = Client.create(clientConfig);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X