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
fonte
2017-05-30 10:07:13
"@ControllerAdvice" è una specializzazione di "@Component", quindi non è necessario aggiungerlo all'inizio della classe. –
cosa intendi per parte citata? Ho modificato la mia risposta per usare '@ RestControllerAdvice'. –
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 –