2014-11-07 14 views
13

Voglio catturare tutte le eccezioni inaspettate in un servizio di riposo in jersey. Quindi ho scritto un ExceptionMapper:Cattura tutte le eccezioni e restituisce anche gli errori personalizzati in Jersey

@Provider 
public class ExceptionMapper implements javax.ws.rs.ext.ExceptionMapper<Exception> { 
    private static Logger logger = LogManager.getLogManager().getLogger(ExceptionMapper.class.getName()); 

    @Override 
    public Response toResponse(Exception e) { 
     logger.log(Level.SEVERE, e.getMessage(), e); 

     return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Internal error").type("text/plain").build(); 
    } 
} 

Il mapper cattura davvero tutte le eccezioni. Quindi non posso scrivere:

public MyResult getById(@PathParam("id")) { 
    if (checkAnyThing) { 
     return new MyResult(); 
    } 
    else { 
     throw new WebApplicationException(Response.Status.NOT_FOUND); 
    } 
} 

Questo è catturato dal Mapper. Ora devo scrivere:

public Response getById(@PathParam("id") { 
    if (checkAnyThing) { { 
     return Response.ok().entity(new MyResult()).build(); 
    } 
    else { 
     return Response.status(Response.Status.NOT_FOUND).build(); 
    } 
} 

E 'questo il modo corretto per catturare tutte le eccezioni inaspettati e anche restituire errori (codici di errore) in jersey? O c'è qualche altro (più corretto) modo?

risposta

20

WebApplicationException ha un getResponse da cui è possibile ottenere il Response. Quindi puoi verificare la presenza di un WebApplicationException nel tuo mappatore. Forse qualcosa di simile

@Override 
public Response toResponse(Throwable error) { 
    Response response; 
    if (error instanceof WebApplicationException) { 
     WebApplicationException webEx = (WebApplicationException)error; 
     response = webEx.getResponse(); 
    } else { 
     response = Response.status(Response.Status.INTERNAL_SERVER_ERROR) 
       .entity("Internal error").type("text/plain").build(); 
    } 
    return response; 
} 

In questo modo un'istanza di WebApplicationException gettato sarà solo restituire la risposta predefinita. In questo modo verranno gestite anche altre eccezioni, non generate esplicitamente dalla tua applicazione. WebApplicationException ha qualche altra eccezione sotto la sua gerarchia che viene lanciata da JAX-RS, per la quale vengono avvolti codici di risposta/stato predefiniti.

Exception      Status code Description 
------------------------------------------------------------------------------- 
BadRequestException   400   Malformed message 
NotAuthorizedException   401   Authentication failure 
ForbiddenException    403   Not permitted to access 
NotFoundException    404   Couldn’t find resource 
NotAllowedException   405   HTTP method not supported 
NotAcceptableException   406   Client media type requested 
                  not supported 
NotSupportedException   415   Client posted media type 
                  not supported 
InternalServerErrorException 500   General server error 
ServiceUnavailableException 503   Server is temporarily unavailable 
                  or busy 

Detto questo, potremmo gettare esplicitamente qualsiasi di queste eccezioni nel nostro codice, proprio per dare più valore semantico.

In generale, tuttavia, l'esempio precedente potrebbe non essere necessario, a meno che non si desideri modificare il messaggio di risposta/codice di stato, come possibile dalla tabella precedente, la gerarchia delle eccezioni ha già una mappatura generale. E nella maggior parte dei casi, le eccezioni impreviste saranno già mappate a InternalServerErrorException

+0

ottima risposta. +1 per il tavolo !!!! –