2014-10-15 8 views
6

La mia applicazione fornisce un'interfaccia RESTful per eseguire alcune azioni. Sto usando ExceptionMapper per la cattura di eccezioni, come NoResultException o EntityNotFoundException e quindi restituire un codice di stato 404, o eccezioni, come NumberFormatException o ConstraintViolationException e restituire un codice di stato 400 ... eccSame ExceptionMapper per diverse eccezioni

Il mio problema è solo che il ExceptionMapper mi consente di scegliere un tipo di Eccezione ogni volta; quindi non posso usare la stessa classe per tutti gli errori 400 e altri tutti gli errori 404.

C'è un modo per creare un ExceptionMapper che mappa due diversi tipi di eccezioni?

mia altra opzione è cambiare le mie funzioni per restituire una risposta, invece di una stringa (contrassegnati come @Produces("application/json")); e quindi impostare il codice di stato ogni volta, ma penso che sia peggio ...

risposta

3

Si potrebbe scrivere un singolo ExceptionMapper contro una superclasse un'eccezione (cioè java.lang.Exception) e quindi fornire comportamenti diversi in base alla classe di eccezione specifica, ad esempio:

public class MyExceptionMapper implements ExceptionMapper<Exception> { 
    @Override 
    public Response toResponse(Exception exception) { 
     if (exception instanceof EntityNotFoundException) { 
      ... 
     } 
     else (exception instanceof NumberFormatException) { 
      ... 
     } 
     else { 
      // The catch-all handler... 
     } 
    } 
} 

Ma a mio parere questo non è pulita come la scrittura mapper separati per ogni tipo di eccezione. Per prima cosa, questo mappatore catturerà tutte le eccezioni, e per un altro questa classe potrebbe raggiungere dimensioni ingombranti nel tempo. Forse è una questione di stile del codice.

+1

Ho pensato anche a questo; ma come dici tu non è pulito. Infatti; puoi scrivere diversi ExceptionMappers per classi diverse e un ExceptionMapper di una superclasse (come Exception); e le eccezioni con uno specifico ExceptionMapper lo useranno; e tutti gli altri useranno l'ExceptionMapper della sua superclasse. –

+1

Preferirei ancora una serie di controlli instanceof contro la frammentazione di questa logica su diverse classi inutilmente piccole e perdere di vista il quadro generale, cioè quali codici di risposta vengono restituiti per quali tipi di eccezioni – Amalgovinus