J'ai reçu la trace de pile ci-dessous lors de l'accès à l'une de mes ressources jax-rs.
J'utilise Tomcat 7, avec Jersey 1.12, Hibernate 4 et MySQL.
J'ai trouvé ce tutoriel en cherchant une solution: http://aruld.info/handling-generified-collections-in-jersey-jax-rs/ mais aucun des exemples cités ne semblait fonctionner.
Qu'est-ce que j'oublie ici?
S'il vous plaît pas de réponses qui m'ont écrit MessageBodyWriters
, cela devrait résoudre la boîte. (Et je sais qu'il y a une solution, je n'arrive pas à comprendre.)
Voici tous mes pots:
antlr-2.7.7.jar
asm-3.1.jar
commons-collections-3.2.1.jar
dom4j-1.6.1.jar
gson-1.7.1.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.0.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
jackson-core-asl-1.9.2.jar
jackson-jaxrs-1.9.2.jar
jackson-mapper-asl-1.9.2.jar
jackson-xc-1.9.2.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.CR2.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
jersey-client-1.12.jar
jersey-core-1.12.jar
jersey-json-1.12.jar
jersey-server-1.12.jar
jersey-servlet-1.12.jar
jettison-1.1.jar
jsr311-api-1.1.1.jar
mysql-connector-Java-3.1.12-bin.jar
Voici ma classe de ressources et ma méthode:
@Path("/region")
public class RegionService {
// This method is called if TEXT_PLAIN is request
@GET
@Produces(MediaType.APPLICATION_JSON)
public JResponse<List<Region>> region() {
RegionDao regionDao = new RegionDao();
regionDao.openSession();
List<Region> regions = regionDao.getAll();
regionDao.closeSession();
return JResponse.ok(regions).build();
}
}
Et voici le stacktrace:
SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.Sun.jersey.api.MessageException: A message body writer for Java class Java.util.ArrayList, and Java type Java.util.List<campher.hibernate.entities.Region>, and MIME media type application/json was not found
at com.Sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.Java:285)
at com.Sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.Java:1451)
at com.Sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.Java:1363)
at com.Sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.Java:1353)
at com.Sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.Java:414)
Vous devez annoter la classe Region avec @XmlRootElement.
comme solution rapide je vois:
final List<MyModel> myList = new ArrayList<>();
Response.ok().entity(new GenericEntity<List<MyModel>>(myList) {}).build();
L'autre réponse ne fonctionnait pas pour moi (j'avais déjà l'annotation XmlRootElement), mais je l'ai finalement obtenue avec JSON. Il retournait très bien XML, mais pas JSON.
J'utilisais jersey-bundle-1.17.jar (également essayé avec asm-3.1.jar et jersey-json-1.17.jar ajoutés à classpath et ne fonctionnaient toujours pas). J'ai finalement juste essayé de télécharger le fichier Zip, qui comprend 12 bocaux différents. Une fois que j'ai ajouté les 12 fichiers jar à mon classpath, je me suis finalement débarrassé de l'erreur et fonctionne très bien en retournant JSON.
J'espère que cela aide quelqu'un.
EDIT: Voici un lien vers le fichier Zip contenant les 12 fichiers jar: jersey-archive-1.17.Zip
@XmlRootElement avec cette annotation, il est possible de sélectionner JSON ou XML dans Jersey ..__ Merci beaucoup!
Il suffit d’ajouter au reste ceci: @ Produit ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
Sur la demande que vous avez définie sur l'en-tête si vous avez gagné le retour en xml ou en json!
Comme vous attendez List, vous pouvez annoter votre classe de bean avec @XmlRootElement. Mais la même chose ne fonctionnera pas pour Map . Jersey utilise en interne moxy pour faire le travail.
Ajouter une dépendance
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>${jersey-version}</version>
</dependency>