web-dev-qa-db-fra.com

Jersey: impossible d'écriture dans le corps du message pour Java Class et le type de média MIME application/json

après avoir essayé de comprendre quel est mon problème, j'ai finalement décidé de vous demander comment résoudre mon problème. J'ai vu différentes personnes avec le même problème et j'ai essayé toutes les choses qu'on leur avait conseillé de faire, mais rien ne m'a aidé avec mon problème. Donc, fondamentalement, je reçois un service RESTful que je construis en utilisant Jersey. Pour mon client, je voudrais renvoyer un objet au format JSON. J'ai lu différents tutoriels et j'ai décidé qu'il était logique d'utiliser la bibliothèque jersey-json-1.8. J'ai tout ajouté à mon projet comme d'habitude et j'ai essayé de l'exécuter, mais chaque fois que j'appelle le service (via get request atm.), Je reçois le code d'erreur HTTP 500 (erreur de serveur interne) et mon serveur répond qu'aucun corps de message écrivain pourrait être trouvé. Si je retourne du XML, cela fonctionne très bien et tout va bien. J'ai également essayé de copier jersey-json-1.8.jar dans mon dossier de bibliothèque Tomcat parce que je devais le faire avec la bibliothèque mysql que j'utilisais, mais cela ne m'a pas aidé non plus. Je serais vraiment ravi de pouvoir vous aider. moi pour que ça marche! Si vous avez besoin de plus d’informations, laissez un commentaire et je le ferai aussi rapidement que possible :)

La configuration de mon projet est la suivante: 3 Différents packages 1. Mes services RESTful 2. Mon travail Java où je gère les connexions SQL, etc . 3. Un package dans lequel je stocke tous mes modèles avec lesquels je dois travailler et que je veux renvoyer au format JSON (dans mon exemple, un itinéraire pour un testdrive)

Un serveur Web Tomcat IDE: Eclipse J'utilise Maven

Quoi que soit ou comment j'essaie de renvoyer l'objet, cela ne fonctionnera tout simplement pas et le message d'erreur suivant s'affiche constamment:

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.mykong.models.Teststrecke, and Java type class com.mykong.models.Teststrecke, and MIME media type application/json was not found

EDIT: Voici ma méthode de service JSON

@Path("/hellojson")
public class JSONService {


    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public ArrayList<Route> getJSONMsg()  
    {

        Route ts = new Route();
        ts.setId(1);
        ts.setName("HelloWorld");


        Route ts2 = new Route();
        ts2.setId(2);
        ts2.setName("HelloWorld");


        ArrayList<Route> availRoutes = new ArrayList<Route>();
        availRoutes.add(ts);
        availRoutes.add(ts2);


        return availRoutes;


    }
}
19
dhartwich

Essayez d’ajouter la bibliothèque Genson à votre chemin de classe http://owlike.github.io/genson/ . Il s’agit d’un api json <> Java pour le streaming et la databinding. Il s’intègre bien avec le maillot, pour que vous puissiez courir, vous avez besoin de 0 configuration. Jersey détecte que la bibliothèque se trouve dans votre chemin de classe et active le mappage JSON en déléguant à Genson.

46
eugen

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>
14
borchvm

L'ajout ci-dessous dépendance a résolu mon problème. Selon @eugen, j'ai essayé d'ajouter la dépendance Genson qui a permis de supprimer l'exception, mais mon serveur lançait 400 requêtes incorrectes pour une raison quelconque. Il semble que Genson n’ait pas pu diffuser correctement la demande json. Mais au-dessous de la dépendance a bien fonctionné. J'espère que cela aidera les autres, car ce problème me rendait dingue!

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.3.0</version>
</dependency>
11
nilesh

Déplacer la dépendance jersey-json au sommet du fichier pom.xml a résolu ce problème pour moi.

<dependencies>
  <dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
  </dependency>

  <!-- other dependencies -->

</dependencies>
3
supercobra

Vérifiez sous Dépendances Maven dans l'Explorateur de paquets, si vous ne voyez pas cela ni jersey-bundle-1.8.jar, vous avez probablement spécifié juste jersey-server. Changez la dépendance dans pom.xml en jersey-bundle et cela devrait fonctionner.

2
Anthony

Jersey 2.4: J'ai aussi fait face à ce problème et le poster en cas aide quelqu'un. J'ai pris cela dans les spécifications de l'API Jersey pour l'intégration JSON: ( https://jersey.Java.net/documentation/latest/user-guide.html#json )

J'ai utilisé Jettison pour l'intégration de Jersey avec JSON. Mais même après l’ajout de toutes les bibliothèques, j’ai eu l’erreur: Un écrivain de corps de message pour Java Class et le type de média MIME application/json était introuvable.

Il s'agit avant tout d'ajouter les bonnes bibliothèques et d'enregistrer des fonctionnalités> J'ai ajouté une bibliothèque supplémentaire à toutes les autres fournies par Jersey: jersey-media-json-jettison-2.4.jar. Et ajouté le code ci-dessous pour enregistrer Jettison Feature. 

   public class MyApplication extends ResourceConfig{
      public MyApplication() {
          register(JettisonFeature.class);
          packages("org.XXX.XXX.XXX");   
    }
1
Jasmine

Le problème ci-dessus sera résolu en utilisant la bibliothèque jackson au lieu du genson.

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.0</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.2</version>
    </dependency>

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

Comme dans mon cas, genson donnait un json vide dans la réponse, mais tout ira bien si nous convertissons le json en chaîne. la bibliothèque jackson qui le fera très facilement.

Remarque: Jackson convertira votre réponse en json uniquement si la classe implémente l'interface Serializable. Ainsi, si vous envoyez JSONObject, il est préférable d'envoyer la liste de JSONObject.

0
Prakhar Agrawal

Supprimer @Produces (MediaType.APPLICATION_JSON); et utilisez le fichier JSONLibraries.Zip pour convertir vos données vers et depuis JSON. Cela fonctionne parfaitement. Le problème avec le code ci-dessus est qu’il utilise la combinaison maven et jackson. Ainsi, APPLICATION_JSON est introuvable lorsque vous utilisez uniquement jersey . J'ai utilisé la conversion vers/depuis le traitement de conversion JSON.

Code:

@Path("/hellojson")
public class JSONService {

    @GET
    public ArrayList<Route> getJSONMsg()  
    {

        Route ts = new Route();
        ts.setId(1);
        ts.setName("HelloWorld");

        Route ts2 = new Route();
        ts2.setId(2);
        ts2.setName("HelloWorld");

        ArrayList<Route> availRoutes = new ArrayList<Route>();
        availRoutes.add(ts);
        availRoutes.add(ts2);

        return JSONObject.fromObject(availRoutes.toString()));
    }
}
0
MankitaP

Cette question a été posée il y a quelque temps, mais pour ceux qui le liront, notez que le conteneur de servlets de jersey a son propre mappeur POJO.

Activez-le en ajoutant ce qui suit à votre web.xml

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

J'ai remarqué quelques divergences dans la façon dont les objets jersey et genson map. Par exemple, si une classe a un champ de type A qui est défini sur une instance de B, qui étend A, genson ne sérialisera pas correctement B, contrairement à jersey.

0
allenwoot