JAX-RS: Comment sérialiser automatiquement une collection lors du renvoi d'un objet Response?
J'ai un JAXB annotées à la classe d'employés:
@XmlRootElement(name = "employee")
public class Employee {
private Integer id;
private String name;
...
@XmlElement(name = "id")
public int getId() {
return this.id;
}
... //setters and getters for name, equals, hashCode, toString
}
Et un JAX-RS objet de la ressource (je suis en utilisant Jersey 1.12)
@GET
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("/")
public List<Employee> findEmployees(
@QueryParam("name") String name,
@QueryParam("page") String pageNumber,
@QueryParam("pageSize") String pageSize) {
...
List<Employee> employees = employeeService.findEmployees(...);
return employees;
}
Ce point de terminaison fonctionne très bien. Je reçois
<employees>
<employee>
<id>2</id>
<name>Ana</name>
</employee>
</employees>
Cependant, si je change la méthode pour retourner un Response
objet, et de mettre la liste des employés dans le corps de la réponse, comme ceci:
@GET
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("/")
public Response findEmployees(
@QueryParam("name") String name,
@QueryParam("page") String pageNumber,
@QueryParam("pageSize") String pageSize) {
...
List<Employee> employees = employeeService.findEmployees(...);
return Response.ok().entity(employees).build();
}
le point de terminaison des résultats dans un HTTP 500 en raison de l'exception suivante:
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type class java.util.ArrayList, and MIME media type application/xml was not found
Dans le premier cas, JAX-RS a évidemment arrangé pour que le message de l'écrivain pour intervenir en cas de retour d'une collection. Il semble quelque peu incompatible que cela ne se produit pas lorsque la collection est placé dans le corps de l'entité. Quelle démarche dois-je prendre pour obtenir de l'automatique JAXB la sérialisation de la liste pour se produire lors du retour d'une réponse?
Je sais que je peux
- Il suffit de retourner la liste à partir de la ressource méthode
- De la création d'un
EmployeeList
classe
mais de savoir si on est une belle façon d'utiliser les Response
objet et obtenir la liste de sérialiser sans créer ma propre classe wrapper.
source d'informationauteur Ray Toal
Vous devez vous connecter pour publier un commentaire.
Vous pouvez envelopper le
List<Employee>
dans une instance deGenericEntity
pour préserver les informations de type:Vous pouvez utiliser GenericEntity pour envoyer la collection dans la Réponse. Vous devez avoir inclus approprié maréchal/unmarshal bibliothèque comme moxy ou jaxrs-jackson.
Ci-dessous le code :
J'ai résolu ce problème en étendant la valeur par défaut JacksonJsonProvider classe, en particulier la méthode writeTo.
En analysant le code source de cette classe, j'ai trouvé le bloc où le type réel est instancié par la réflexion, donc j'ai modifié le code source ci-dessous: