De retour JSON ou XML pour les Exceptions en Jersey
Mon but est d'avoir une erreur de haricot de retour sur une 404 avec un descriptif d'un message lorsqu'un objet n'est pas trouvé, et revenir par le même type MIME qui a été demandé.
J'ai un regard de ressource, qui sera de retour l'objet spécifié au format XML ou JSON en fonction de l'URI (j'ai mis le com.soleil.jersey.config.de la propriété.resourceConfigClass servlet paramètre, donc je n'ai pas besoin de l'en-tête Accept. Mon JAXBContextResolver a l'ErrorBean.class dans sa liste de types et de les corriger JAXBContext est retourné pour cette classe parce que je peux voir dans les logs).
par exemple: http://foobar.com/rest/locations/1.json
@GET
@Path("{id}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Location getCustomer(@PathParam("id") int cId) {
//look up location from datastore
....
if (location == null) {
throw new NotFoundException("Location" + cId + " is not found");
}
}
Et mon NotFoundException ressemble à ceci:
public class NotFoundException extends WebApplicationException {
public NotFoundException(String message) {
super(Response.status(Response.Status.NOT_FOUND).
entity(new
ErrorBean(
message,
Response.Status.NOT_FOUND.getStatusCode()
)
.build());
}
}
La ErrorBean est comme suit:
@XmlRootElement(name = "error")
public class ErrorBean {
private String errorMsg;
private int errorCode;
//no-arg constructor, property constructor, getter and setters
...
}
Cependant, je suis toujours un 204 Aucun Contenu de réponse quand j'ai essayer cette. J'ai piraté autour, et si je retourne une chaîne de caractères et de spécifier le type mime cela fonctionne bien:
public NotFoundException(String message) {
super(Response.status(Response.Status.NOT_FOUND).
entity(message).type("text/plain").build());
}
J'ai aussi essayé de retourner un ErrorBean comme une ressource. Cela fonctionne bien:
{"errorCode":404,"errorMsg":"Location 1 is not found!"}
OriginalL'auteur Dominic | 2010-05-20
Vous devez vous connecter pour publier un commentaire.
Pour ceux qui ont des problèmes similaires à l'avenir ...
S'avère que mon code était OK à la fin. J'étais tirant sur mes cheveux, donc je l'ai réécrit ce module, et était toujours pas arriver n'importe où. Mon navigateur juste rester là et de s'accrocher éternellement. J'ai commencé à inspecter les en-têtes avec LiveHTTPHeaders (extension de firefox), et a remarqué quand c'est arrivé Contenu de Longueur est plus grande que zéro. J'ai ensuite testé avec hurl.il et a trouvé le corps était de retour normalement. Le navigateur va s'occuper de la réponse XML bien, mais ne jamais afficher le JSON (donc la pendaison). C'est très bien pour mon usage, comme c'est purement une API pour application la consommation et non pour les utilisateurs. Il y a des informations sur la cartographie des exceptions à la Maillot wiki.
OriginalL'auteur Dominic