我有一些十个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的所有API都这样做,有没有更好的方法来处理异常。
答案 0 :(得分:3)
您可以使用@RestControllerAdvice
。使每个控制器的自定义异常类CustomRedisException
引发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);
}
}
答案 1 :(得分:0)
您可以使用方面和@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
}
}