2010-05-20 14 views
11

Mi objetivo es tener un error bean devuelto en un 404 con un mensaje descriptivo cuando no se encuentra un objeto, y devolver el mismo tipo MIME que se solicitó.Devolver JSON o XML para excepciones en Jersey

Tengo un recurso de búsqueda, que devolverá el objeto especificado en XML o JSON basado en el URI (configuré el parámetro del servlet com.sun.jersey.config.property.resourceConfigClass, así que no necesito el encabezado Accept . Mi JAXBContextResolver tiene el ErrorBean.class en su lista de tipos, y el JAXBContext correcto se devuelve para esta clase porque puedo ver en los registros).

por ejemplo: 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"); 
    } 

} 

Y mi NotFoundException se ve así:

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()); 
    } 

} 

El ErrorBean es el siguiente:

@XmlRootElement(name = "error") 
public class ErrorBean { 

    private String errorMsg; 
    private int errorCode; 

     //no-arg constructor, property constructor, getter and setters 
     ... 

} 

Sin embargo, siempre estoy recibiendo un 204 Sin contenido respuesta cuando intento esta. He cortado alrededor, y si vuelvo una cadena y especifique el tipo MIME Esto funciona bien:

public NotFoundException(String message) { 
    super(Response.status(Response.Status.NOT_FOUND). 
      entity(message).type("text/plain").build()); 
} 

también he intentado devolver un ErrorBean como un recurso. Esto funciona bien:

{"errorCode":404,"errorMsg":"Location 1 is not found!"} 

Respuesta

9

Para aquellos con problemas similares en el futuro ...

Resulta que mi código estaba bien al final. Estaba tirando de mi cabello, así que reescribí este módulo, y todavía no estaba llegando a ningún lado. Mi navegador se quedaba allí y quedaba para siempre. Empecé a inspeccionar los encabezados con LiveHTTPHeaders (complemento de Firefox), y me di cuenta cuando esto sucedía Content-Length era más grande que cero. Luego probé con hurl.it y descubrí que el cuerpo volvía normalmente. El navegador manejaría bien la respuesta XML, pero nunca mostraría el JSON (por lo tanto, el bloqueo). Esto está bien para mi propósito, ya que es puramente una API para consumo de aplicaciones y no para usuarios. Hay información sobre el mapeo de excepciones en el Jersey wiki.

HTTP/1.1 404 Not Found 
Content-Type: application/json 
Date: Fri, 21 May 2010 06:39:28 GMT 
Server: Google Frontend 
Cache-Control: private, x-gzip-ok="" 
Transfer-Encoding: chunked 

{ 
    "errorCode": "404", 
    "errorMsg": "Could not retrieve entity of kind Location with key Location(10)" 
} 
Cuestiones relacionadas