#spring #spring-boot #exception
#spring #spring-boot #исключение
Вопрос:
У меня есть около десяти API, которые взаимодействуют с redis для хранения данных.
В настоящее время он генерирует вложенное исключение, поэтому я сделал, как показано ниже, для обработки вложенного исключения.
@Override
public boolean delMyStatus(String key) {
try{
return redisTemplate.delete(key);
}
catch (Exception e){
if(e.getCause() != null amp;amp; e.getCause().getCause() instanceof RedisException) {
RedisException ex = (RedisException)e.getCause().getCause();
log.error("RedisException " ex.getMessage());
/* Do some action*/
} else {
throw new IllegalStateException("...");
}
}
return false;
}
Но я не хочу делать это для всех API redis dao, есть ли лучший способ обработки исключения.
Комментарии:
1.
catch (RedisException e){}
?2. catch (RedisException e){ log.error («RedisException» ex.GetMessage()); } catch (Exception e){ log.error («Exception » ex.GetMessage()); } Это всегда приводит к блокировке исключения
Ответ №1:
Вы можете использовать @RestControllerAdvice
. Создайте пользовательский класс исключений, CustomRedisException
выбрасывающий CustomRedisException
исключение из каждого контроллера, и обрабатывайте это отдельно, class
аннотируясь с помощью @RestControllerAdvice
.
@Override
public boolean delMyStatus(String key) {
try{
return redisTemplate.delete(key);
}
catch (Exception e){
if(e.getCause() != null amp;amp; e.getCause().getCause() instanceof RedisException) { RedisException ex = (RedisException)e.getCause().getCause();
throw new CustomRedisException(ex);
} else {
throw new IllegalStateException("...");
}
}
return false;
}
Создайте GlobalExceptionHandler, как показано ниже.
@RestControllerAdvice(basePackages = "your base package here", basePackageClasses = RepositoryRestExceptionHandler.class)
public class GlobalRestExceptionHandler {
@ExceptionHandler
public ResponseEntity<ErrorResponse> handleCustomException(final CustomRedisExceptionex) {
// code for exception handling here.
return new ResponseEntity<>(
new ErrorResponse(HttpStatus.PRECONDITION_FAILED.value(), ex.getMessage()),
HttpStatus.PRECONDITION_FAILED);
}
}
Комментарии:
1. На самом деле я не хочу возвращать эту ошибку в rest-controller, это было для какой-то внутренней операции, поэтому я хочу обработать эту ошибку внутренне и выполнить некоторые действия на основе этого
2. В этом случае вы можете создать общий метод для обработки исключения и вызывать его из каждого блока catch.
Ответ №2:
Вы можете достичь этого с помощью аспектов и @AfterThrowing
аннотации.
Сначала убедитесь, что вы разрешили Spring использовать аспекты с помощью @EnableAspectJAutoProxy
аннотации в любом из ваших классов конфигурации.
Затем определите @Aspect
класс с методом, аннотированным с помощью @AfterThrowing
, следующим образом:
@Aspect
public class GenericExceptionHandler {
// you can use more specific path here
@AfterThrowing ("execution(* *.*(..))", throwing = "ex")
public void handleException(Exception ex) throws Exception {
// handle the exception here
}
}
Комментарии:
1. В этом я хочу зарегистрировать некоторый параметр, отправленный вызывающим абонентом. Итак, как отправить пользовательский параметр вместе с исключением в функцию @AfterThrowing