5

Desidero sapere come posso gestire le eccezioni del tipo di errore del server interno in Spring Data Rest come eccezioni JPA ecc. A causa di una richiesta errata o di un arresto anomalo del database. Ho fatto alcune ricerche per scoprire che il modo migliore per farlo è usare @ControllerAdvice ma non trovarne alcun esempio funzionante. Ho esaminato entrambe queste domande, ma non hanno ancora ricevuto risposta.Gestione anomalie Spring Rest - Risposta errore generica

How can I handle exceptions with Spring Data Rest and the PagingAndSortingRepository?

global exception handling for rest exposed spring-data

qualcuno può aiutarmi con un esempio di lavoro di come utilizzare @ControllerAdvice e scrivere una risposta di errore personalizzato di nuovo al cliente ogni volta che c'è un'eccezione.

risposta

2

È possibile farlo in questo modo:

@ControllerAdvice(basePackageClasses = RepositoryRestExceptionHandler.class) 
public class GenericExceptionHandler { 

    @ExceptionHandler 
    ResponseEntity handle(Exception e) { 
     return new ResponseEntity("Some message", new HttpHeaders(), HttpStatus.BAD_REQUEST); 
    } 
} 
0

Questo è il modo in cui lo faccio per tutti gli errori di richiesta di convalida,

@RestControllerAdvice 
public class ApplicationExceptionHandler { 

    @ExceptionHandler 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    public ResponseBean handle(MethodArgumentNotValidException exception){ 

     StringBuilder messages = new StringBuilder(); 
     ResponseBean response = new ResponseBean(); 

     int count = 1; 
     for(ObjectError error:exception.getBindingResult().getAllErrors()){ 
      messages.append(" "+count+"."+error.getDefaultMessage()); 
      ++count; 
     } 

     response.setMessage(messages.toString()); 
     return response; 
    } 
} 

dove ResponseBean è la mia classe specifica applicazione.

Per gli errori JPA, le eccezioni sono RuntimeException e l'eccezione di livello superiore è org.springframework.dao.DataAccessException.

Se si desidera inviare un messaggio generico al client, non è necessario catturare - ripiegare su DAO, Service o Controller Layer. Basta aggiungere un gestore di eccezioni come sopra per DataAccessException e il gioco è fatto.

Se si desidera impostare messaggi specifici per client per specifiche eccezioni, è necessario scrivere una gerarchia di eccezioni specifica dell'applicazione che si estende DataAccessException, diciamo MyAppJPAException. Devi prendere - DataAccessException nel codice dell'applicazione (a livello DAO, Servizio o Controller) e generare MyAppJPAException. MyAppJPAException dovrebbe avere un campo messaggio personalizzato in cui è necessario impostare il messaggio personalizzato prima di eseguire il lancio. Nel gestore MyAppJPAException, è possibile impostare tale messaggio in risposta e impostare HTTP Status come - HttpStatus.INTERNAL_SERVER_ERROR

+0

"@ControllerAdvice" è una specializzazione di "@Component", quindi non è necessario aggiungerlo all'inizio della classe. –

+0

cosa intendi per parte citata? Ho modificato la mia risposta per usare '@ RestControllerAdvice'. –

+0

ok, Sabir. per favore guarda il codice sorgente di "@ControllerAdvice" https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html che dice che non c'è usa l'allng "@Component" con esso. BTW utilizzando "@RestControllerAdvice" non è più necessario utilizzare "@ResponseBody" nella classe: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/ bind/annotazione/RestControllerAdvice.html –