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