2010-05-20 19 views
11

Il mio obiettivo è avere un bean di errore restituito su un 404 con un messaggio descrittivo quando un oggetto non viene trovato e restituire lo stesso tipo MIME richiesto.Restituzione di JSON o XML per le eccezioni nel Jersey

Ho una risorsa di ricerca, che restituirà l'oggetto specificato in XML o JSON basato sull'URI (Ho impostato il parametro servlet com.sun.jersey.config.property.resourceConfigClass in modo da non avere bisogno dell'intestazione Accept . Il mio JAXBContextResolver ha ErrorBean.class nel suo elenco di tipi e il JAXBContext corretto viene restituito per questa classe perché posso vedere nei log).

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

} 

E il mio NotFoundException assomiglia a questo:

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

} 

L'ErrorBean è la seguente:

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

    private String errorMsg; 
    private int errorCode; 

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

} 

Tuttavia, sono sempre di ottenere un 204 Nessuna risposta quando provo Questo. Ho violato in giro, e se torno una stringa e specificare il tipo MIME Questo funziona bene:

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

Ho anche cercato di restituire un ErrorBean come una risorsa. Questo funziona bene:

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

risposta

9

Per quelli con problemi simili in futuro ...

Risulta mio codice era OK, alla fine. Mi stavo strappando i capelli, quindi ho riscritto questo modulo e non riuscivo ancora a ottenere nulla. Il mio browser si sarebbe seduto lì e sarebbe rimasto per sempre. Ho iniziato a ispezionare le intestazioni con LiveHTTPHeaders (componente aggiuntivo per Firefox) e ho notato che quando ciò accadeva, Content-Length era più grande di zero. Ho quindi testato con hurl.it e ho scoperto che il corpo stava tornando normalmente. Il browser gestiva bene la risposta XML, ma non mostrava mai il JSON (quindi l'impiccagione). Questo va bene per il mio scopo in quanto si tratta puramente di un'API per il consumo delle applicazioni e non per gli utenti. Sono disponibili informazioni sulla mappatura delle eccezioni su 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)" 
} 
Problemi correlati