web-dev-qa-db-fra.com

Obtention de "MessageBodyWriter introuvable pour le type de support = application/json" essayant d'envoyer un objet JSON via le service Web JAX-RS

J'essaie d'envoyer un objet JSON via un service Web JAX-RS . Mon fichier web.xml est:

<servlet>
 <description>JAX-RS Tools Generated - Do not modify</description>
 <servlet-name>JAX-RS Servlet</servlet-name>
 <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  <init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>it.notifire</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>JAX-RS Servlet</servlet-name>
  <url-pattern>/jaxrs/*</url-pattern>
</servlet-mapping>

La classe qui modélise l'objet que je veux envoyer est:

public class GPSCoordinate {

private float latitudine;
private float longitudine;

 public float getLatitudine() {
    return latitudine;
}
public void setLatitudine(float latitudine) {
     this.latitudine = latitudine;
}
public float getLongitudine() {
    return longitudine;
}
public void setLongitudine(float longitudine) {
    this.longitudine = longitudine;
}
}

La ressource de classe racine est:

@Path("position")
public class Position {

    @Context
private UriInfo context;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public GPSCoordinate getHTML() {

        GPSCoordinate coord = new GPSCoordinate();
        coord.setLatitudine(90.45f);
        coord.setLongitudine(34.56f);

        return coord;
    }
}

Maintenant, quand j'essaie d'accéder au service, je pointe mon navigateur sur le lien suivant

http://localhost:8080/Notifire/jaxrs/position

et j'obtiens l'erreur suivante:

message org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter introuvable pour le type de média = application/json

Dans mon dossier WEB-INF/lib, j'ai la dernière version de l'implémentation du jersey JAX-RS (jaxrs-ri-2.5.jar) et l'archive jersey-json.jar.

Toute aide serait très appréciée.

24
amedeo avogadro

Essayez d'ajouter Genson à votre chemin de classe, cela activera automatiquement le support JSON.

Genson est une bibliothèque de liaison de données et de diffusion en continu pour json et Java/scala. Il implémente les points d'extension MessageBodyReader/Writer de JAX-RS, ce qui permet au maillot de détecter automatiquement Genson et de l'utiliser pour l'analyse/l'écriture de Json.

Vous pouvez trouver plus d’informations sur L’intégration de Gensons avec JaxRS (jersey & cie).

52
eugen

Jersey prend en charge les fonctionnalités «autodécouvrables» et le support JSON en est un. Pour l'activer, vous devez ajouter une bibliothèque compatible à votre chemin, en fonction de the docs

Cependant, bien que la bibliothèque recommandée jersey-media-json-processing n'ait pas été reconnue dans mon cas pour une raison quelconque, jersey-media-moxy a:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.15</version>
</dependency>

2.15 était la dernière version au moment de la rédaction. Visitez la page maven central artefact pour trouver la version actuelle.

9
kostja

Voici comment j'ai résolu le problème. 

Jackson d'occasion. Ajout de ces pots enter image description here

Ajout de cette classe à mon projet. Les lignes de clé du code sont marquées IMPORTANT. 

import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; <-- IMPORTANT
import Java.util.HashSet;
import Java.util.Set;
import javax.ws.rs.core.Application;

//@javax.ws.rs.ApplicationPath("webresources")
public class MyApplicationConfig extends Application {

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> resources = new Java.util.HashSet<Class<?>>();
    //addRestResourceClasses(resources);
    //resources.add(MultiPartFeature.class);
    //resources.add(JettisonFeature.class);
    return resources;
}

@Override
public Set<Object> getSingletons() {
    final Set<Object> instances = new HashSet<Object>();

    instances.add(new JacksonJsonProvider()); <--------- IMPORTANT
    return instances;
}
/**
 * Do not modify addRestResourceClasses() method.
 * It is automatically populated with
 * all resources defined in the project.
 * If required, comment out calling this method in getClasses().
 */
private void addRestResourceClasses(Set<Class<?>> resources) {
    //resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class);
    //resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class);

}

}
4
bickster

Enregistrez la classe JacksonJsonProvier avec la configuration du client, puis créez l'objet Client, cela a fonctionné pour moi. Ci-dessous le code.

    ClientConfig config = new ClientConfig();
    config.register(JacksonJsonProvider.class);
    Client client = ClientBuilder.newClient(config);
4
lakshmanas

Ma cause fondamentale était légèrement différente. J'ai passé un certain temps à déboguer le code source de Jersey et il s'est avéré que la construction de la variable JAXBContext échouait à cause du constructeur manquant dans la classe JAXB. Cela se produit lors de la recherche d'un MessageBodyWriter approprié, mais l'exception n'est pas gérée.

Voici l'extrait de code correspondant (MOXyJsonProvider: 324):

try {
    Set<Class<?>> domainClasses = getDomainClasses(genericType);
    return getJAXBContext(domainClasses, annotations, mediaType, null);
} catch(JAXBException e) {
    return null;
}

Donc, si vous avez la dépendance Moxy JSON dans POM, vérifiez que vos classes JAXB sont valides.

Les versions que j'utilise: Jersey 2.19, Moxy 2.6.0.

2
jFrenetic

Cela a fonctionné pour moi en ajoutant tous les pots requis de Jackson . Ajouté ces pots

  • jackson-annotations-2.8.7.jar, 
  • jackson-core-2.8.7.jar
  • jackson-databind-2.8.7.jar
  • jackson-jaxrs-base-2.8.7.jar
  • jackson-jaxrs-json-provider-2.8.3.jar
  • jackson-module-jaxb-annotations-2.8.7.jar
0
Hemant Daga

Allez à https://jersey.Java.net/documentation/2.5.1/user-guide.html#json

Vous devez compléter votre cours .... JAXB en a besoin, exemple:

@XmlRootElement
public class MyJaxbBean {

    @XmlElement(name="king")
    public String name;

    @XmlTransient
    public int age;

    // several lines removed
}
0
Rod SolPar