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.
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).
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.
Voici comment j'ai résolu le problème.
Jackson d'occasion. Ajout de ces pots
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);
}
}
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);
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.
Cela a fonctionné pour moi en ajoutant tous les pots requis de Jackson . Ajouté ces pots
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
}