Spring JPA - обработка исключений DB / Repo - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть приложение SpringBoot, которое использует данные весны CrudRepository для сохранения сообщений. Для приложения важно не терять сообщения, когда исключение на стороне сервера БД .

, например, недоступен сервер БД или экземпляр БД сталкивается с проблемами памяти и т. Д. c.

Поэтому я хочу обработать их особенно и повторить, пока проблема на стороне БД не будет решена. Я наткнулся на эту статью, в которой объясняются Exception классы, выброшенные Spring JPA https://danielkvist.net/code/spring-data-crudrepository-exceptions, в которых обобщается иерархия Exception для Spring JPA. Поэтому я применил следующую Exception обработку logi c.

saveMessages (List<Message> messages)
{
    try {
        crudRepo.saveAll(messages);
    } catch (NonTransientDataAccessException | TransientDataAccessException e) {
      // throw custom retryable exception for the service to retry
      throw new CustomRetryableException(e);
    }
}

Когда код был выполнен в производстве выше logi c, произошел сбой, поскольку возникали различные типы исключений. например, когда сервер БД был отключен, CannotCreateTransactionException был сброшен или когда сервер БД был перезапущен в промежутке между запросами TransactionSystemException. Поэтому я думаю, что пропустил обработку подклассов TransactionException

Вопросы:

  1. Каков наилучший способ обработки подклассов TransactionException? (В контексте, который я упомянул в начале)

  2. Существуют ли какие-либо дополнительные исключения (кроме DataAccessException и TransactionException, которые я должен обработать?

1 Ответ

0 голосов
/ 20 апреля 2020

вы можете перехватить родительский класс ваших исключений, но если вы хотите поймать / обработать исключения в DAO / сервисе, я бы просто перехватил RuntimeException

try {
    crudRepo.saveAll(messages);
} catch (RuntimeException e) {
  // add log here!

  throw new CustomRetryableException(e);
}

Другой подход заключается в использовании generi c ExceptionHandler для определения этой логики c в отдельном классе (вы также можете определить разные обработчики для разных исключений)

 @ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> genericHandler(HttpServletRequest request, RuntimeException ex) {

Дополнительная информация и примеры здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...