Лучший способ справиться с исключением - это Spring-Boot - PullRequest
0 голосов
/ 11 марта 2019

У меня есть несколько API, которые общаются с Redis для хранения данных.

В настоящее время он генерирует вложенное исключение, поэтому я сделал, как показано ниже, для обработки вложенного исключения.

    @Override 
    public boolean delMyStatus(String key) {
        try{
            return  redisTemplate.delete(key);
        }
        catch (Exception e){
            if(e.getCause() != null && 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;
    }

Но я не хочу делать это для всех АПИС Redis Dao, есть ли лучший способ обработки исключений.

Ответы [ 2 ]

3 голосов
/ 11 марта 2019

Вы можете использовать @RestControllerAdvice. Создайте пользовательский класс исключений CustomRedisException throw CustomRedisException Исключение из каждого контроллера и обработайте его в отдельном class с пометкой @RestControllerAdvice.

@Override 
public boolean delMyStatus(String key) {
    try{
        return  redisTemplate.delete(key);
    }
    catch (Exception e){
        if(e.getCause() != null && 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);
    }
}
0 голосов
/ 11 марта 2019

Вы можете достичь этого с помощью аспектов и @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
     }

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