5

Я хочу знать, как я могу обрабатывать исключения типа внутреннего сервера в Spring Data Rest, такие как исключения JPA и т. Д. Из-за искаженного запроса или сбоя базы данных. Я сделал некоторые исследования, которые показали, что лучший способ сделать это - использовать @ControllerAdvice, но не смог найти какой-либо рабочий пример. Я рассмотрел оба эти вопроса, но они все еще остаются без ответа.Обработка исключений для обработки данных Spring Data - Ответ на возвращаемый общий ответ

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

global exception handling for rest exposed spring-data

Может кто-то помочь мне с рабочим примером того, как использовать @ControllerAdvice и написать ответ пользовательские ошибки обратно клиенту, когда есть исключение.

ответ

2

Вы можете сделать это следующим образом:

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

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

Это так, как я делаю это для всех ошибок валидации запроса,

@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

+0

«@ControllerAdvice» является специализацией «@Component», поэтому вы не должны добавлять его в начало класса. –

+0

Что вы имеете в виду о цитируемой части? Однако я отредактировал свой ответ, чтобы использовать '@ RestControllerAdvice'. –

+0

ОК, Сабир. посмотрите исходный код «@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 –

Смежные вопросы