Это так, как я делаю это для всех ошибок валидации запроса,
@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;
}
}
где ResponseBean
это мое приложение конкретный класс.
Для ошибок JPA исключениями являются RuntimeExceptions и верхний уровень Исключение составляет - org.springframework.dao.DataAccessException
.
Если вы хотите отправить общее сообщение клиенту, нет необходимости перехватывать ваш DAO, Service или Controller Layer. Просто добавьте обработчик исключений, как указано выше, для DataAccessException
, и все готово.
Если вы хотите установить конкретные сообщения для клиента для определенных исключений, вам необходимо написать иерархию исключений для конкретного приложения, расширяющую DataAccessException
, скажем MyAppJPAException
. Вам нужно поймать - DataAccessException
в вашем коде приложения (на уровне DAO, Service или Controller) и re throw MyAppJPAException
. MyAppJPAException
должно иметь настраиваемое поле сообщения, в котором вы должны установить свое пользовательское сообщение перед повторным броском. В обработчике MyAppJPAException
вы установите это сообщение в ответ и можете установить HTTP-статус как - HttpStatus.INTERNAL_SERVER_ERROR
«@ControllerAdvice» является специализацией «@Component», поэтому вы не должны добавлять его в начало класса. –
Что вы имеете в виду о цитируемой части? Однако я отредактировал свой ответ, чтобы использовать '@ RestControllerAdvice'. –
ОК, Сабир. посмотрите исходный код «@ControllerAdvice» https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html , в котором говорится, что нет используйте добавление «@Component» allng с ним. BTW с помощью «@RestControllerAdvice» вам больше не нужно использовать «@ResponseBody» в классе: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/ привязка/аннотации/RestControllerAdvice.html –