Qual è il modo consigliato di gestire l'eccezione in Spring MVC

2

Ho un'applicazione Spring, in cui effettuiamo alcune chiamate di servizio per recuperare i dati. Esiste un livello dati tra i livelli del controller e del servizio.

Controller (Request-Mapping) -> Data Layer -> Service Layer

Se non otteniamo i dati dal servizio sottostante, intendiamo lanciare un'eccezione. La mia domanda riguarda le migliori pratiche da adottare qui:

  1. Devo creare DataProvider (livello dati) e il controller lancia l'eccezione e lascia che il tomcat gestisca tramite web.xml?

  2. Devo rilevare l'eccezione nel Data Layer stesso, registrarlo e non propagare l'eccezione al Controller?

In particolare, sarebbe una buona cosa contrassegnare il controller come "lancia CustomException"?

    
posta Abhigyan Mehra 23.06.2016 - 18:47
fonte

2 risposte

3

Contrariamente all'opinione che il lancio di eccezioni dai metodi di gestione del controller sia sbagliato, mi raccomando di farlo. I motivi sono i seguenti:

  1. Elimina un sacco di codice boilerplate. Quasi tutti i tentativi di cattura nei controller sono uguali e vengono spesso copiati da una posizione all'altra. Aumenta il carico di manutenzione del codice e l'accoppiamento tra i controller e la gerarchia delle eccezioni.

  2. Esistono altri modi per gestire correttamente le eccezioni. La soluzione migliore è avere un gestore di eccezioni globale, che traduca tipi specifici di eccezioni ai codici di risposta HTTP. Per esempio. quando la query del database o la chiamata remota non riesce con timeout, è possibile convertirla in HTTP 503. Quando il repository genera ObjectNotFoundException, è possibile restituire HTTP 404. Quando la convalida non riesce, rispondere con HTTP 400. È anche possibile avere gestori specifici del controller in pochi casi specifici (variare il situta raro).

Detto questo, non significa che dovresti avere "lancia Eccezione" nella firma del metodo. Negli oggetti di architettura a più livelli in livelli superiori, come i controller, non ci si può aspettare eccezioni di basso livello (ad esempio dal driver JDBC), perché violerebbero l'incapsulamento. Dovrebbe esserci una gerarchia di eccezioni separata per livello, che ha una semantica specifica per quel livello e dovrebbe esserci una traduzione di eccezioni (normalmente eseguita da un wrapping). Ad esempio, ConstraintViolationException nel repository può generare InvalidServiceRequestException in Service e tradotto in HTTP 400 dal gestore delle eccezioni.

    
risposta data 17.09.2016 - 19:09
fonte
0

È possibile gestire l'eccezione esplicitamente nel metodo del controllore, laddove possibile, usando @ResponseStatus, @ExceptionHandler, annotazione @ControllerAdvice. Per ulteriori dettagli, fare riferimento a: Gestione delle eccezioni in MVC primaverile .

    
risposta data 24.06.2016 - 07:25
fonte

Leggi altre domande sui tag