Je suis confronté à des problèmes lors de l'utilisation des services JAX-RS en tant que JSON.
Ci-dessous, j'ai ajouté mon code.
Ceci est ma classe de service:
//Sets the path to base URL + /hello
@Path("/hello")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class Hello {
@GET
@Produces("application/json")
public Student getStudent() {
Student s = new Student();
s.first_name = "Test First Name !!!";
s.last_name = "Test Last Name!!!";
return s;
}
Student
classe que j'essaie d'obtenir du service:
@XmlRootElement
public class Student implements Serializable {
public String first_name;
public String last_name;
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public Student()
{
first_name = "Fahad";
last_name = "Mullaji";
}
}
Web XML côté service.
<?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"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>com.vogella.jersey.first</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Register resources and providers under com.vogella.jersey.first package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.vogella.jersey.first</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>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Je ne sais pas comment résoudre ce problème. J'utilise SOAP UI pour tester la réponse JSON, mais je suppose que cela ne devrait pas avoir d'importance.
De nombreux endroits où j'ai lu qu'il me fallait ajouter le code ci-dessous. Mais je ne sais pas où. Je n'utilise pas Maven pour la construction.
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
</dependency>
Le serveur recherche une fonction pour analyser l'objet Student
au format JSON, mais il n'est pas en mesure de trouver la fonction ou le fichier jar correspondant. J'ai ajouté les pots de Genson, Moxy, RESTEasy et Jackson mais je pense que c'est le problème. Je pense que la cartographie me manque quelque part.
Eh bien, je ne pouvais pas faire fonctionner le projet Web ci-dessus. Mais j'ai continué à faire des recherches sur JAX-RS et je suis tombé sur le tutoriel de Stormpath. Je pense que quiconque cherche à savoir comment REST, JSON et Jersey travaillent ensemble devrait regarder cela.
Veuillez consulter les liens ci-dessous pour obtenir leur présentation et un exemple de projet REST sur GitHub.
https://www.youtube.com/watch?v=sVvL12BnIyy
https://github.com/stormpath/todos-jersey
Maintenant, je peux comparer le projet ci-dessus et voir toutes les choses que j'ai mal faites.
J'ai pu le réparer en installant jersey-media-json-jackson
Ajouter la dépendance à pom.xml
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<scope>runtime</scope>
</dependency>
Vous devez créer un constructeur vide car JAX-RS initialise les classes ... Votre constructeur ne doit avoir aucun argument:
@XmlRootElement
public class Student implements Serializable {
public String first_name;
public String last_name;
public String getFirst_name() {
return first_name;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public String getLast_name() {
return last_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public Student()
{
first_name = "Fahad";
last_name = "Mullaji";
}
public Student()
{
}
}
J'étais dans la même situation où
- J'étais pas en utilisant Maven ou Ant,
- J'ai fini ce tutoriel Vogella sur Jersey ,
- et j'obtenais l'erreur MessageBodyWriter
en essayant d'utiliser @Produces(MediaType.APPLICATION_JSON)
.
Cette réponse par @peeskillet résout le problème - vous devez utiliser les fichiers Jackson * .jar disponibles à partir de page de téléchargement de FasterXML Jackson =. Vous aurez besoin des fichiers core
ainsi que des fichiers jaxrs
.
Je les ai ajoutés à mon dossier WebContent/WEB-INF/lib
où se trouvent mes fichiers Jersey * .jar, conformément au tutoriel ci-dessus, et apporté la petite modification au fichier web.xml ci-dessous (à nouveau, tel que partagé à l'origine par @peeskillet):
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
your.other.package.here, com.fasterxml.jackson.jaxrs.json
</param-value>
La partie importante étant com.fasterxml.jackson.jaxrs.json
.
Décommenter le code ci-dessous a aidé
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
</dependency>
qui était présent dans pom.xml dans mon projet basé sur maven a résolu cette erreur pour moi.
Ci-dessous devrait figurer dans votre pom.xml au-dessus des autres dépendances de jersy/jackson. Dans mon cas, comme ci-dessous jersy-client dep-cy et j'ai obtenu MessageBodyWriter introuvable pour le type de support = application/json.
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25</version>
</dependency>
Je pense que vous devriez peut-être essayer de convertir les données au format JSON. Cela peut être fait en utilisant gson lib. Essayez quelque chose comme ci-dessous.
Je ne sais pas si c'est la meilleure solution ou non, mais vous pouvez le faire de cette façon. Cela a fonctionné pour moi.
exemple: `
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response info(@HeaderParam("Accept") String accept) {
Info information = new Info();
information.setInfo("Calc Application Info");
System.out.println(accept);
if (!accept.equals(MediaType.APPLICATION_JSON)) {
return Response.status(Status.ACCEPTED).entity(information).build();
} else {
Gson jsonConverter = new GsonBuilder().create();
return Response.status(Status.ACCEPTED).entity(jsonConverter.toJson(information)).build();
}
}
Pour résoudre ce problème, essayez ce qui suit. Travaillé pour moi.
Ajouter la dépendance suivante dans le pom.xml
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25</version>
</dependency>
Et assurez-vous que classe de modèle contient pas de constructeur arg
public Student()
{
}