拦截 repository 方法抛出的不同错误码的异常
Intercept exceptions thrown by repository method with different error codes
有没有办法拦截数据层 (@Repository
) 抛出的 DataAccessException
并知道是哪个方法导致了这个异常?
编写自定义 SQLExceptionTranslator
不符合我的需要,因为我无法确定是哪个方法导致了异常。
我有这样的存储库:
public interface UserRepository extends JpaRepository<UserEntity, Integer> {
@ErrorCode("E1000")
User findById(int id);
@ErrorCode("E1001")
User findByUsername(String username);
}
ErrorCode
是一个自定义注释,其中包含一个错误代码,每当 DataAccessException
发生时我都需要将其发送给客户端。
如果有一种方法可以通过捕获 DataAccessException
来拦截对 findById
的调用,那么很容易从注释中提取错误代码并重新抛出可以被捕获的自定义异常异常处理程序。
如果允许Spring AOP,您可以构建自己的切面,例如:
@Aspect
public class ErrorCodeAspect {
@Around("@annotation(errorCode)")
public Object aroundErrorCode(ProceedingJoinPoint joinPoint, ErrorCode errorCode) throws Throwable {
try {
return joinPoint.proceed();
} catch (DataAccessException dae) {
throw new YourCustomException(errorCode.value(), dae);
}
}
}
请注意,接口方法上的注释 不是 通过实现 class 方法继承的(即使 @Inherited
适用于父 classes),因此您可能需要注释您的具体服务 classes 而不是要插入的方面(除非 Spring 对我不知道的存储库代理)。
您可以定义自定义 ExceptionHandler
。
@RestControllerAdvice
public class RestExceptionResolver {
@ExceptionHandler(DataAccessException.class)
public ResponseEntity<String> handleNoSuchElementException(DataAccessException ex) {
return ResponseEntity.status(yourErrorCode);
}
}
有没有办法拦截数据层 (@Repository
) 抛出的 DataAccessException
并知道是哪个方法导致了这个异常?
编写自定义 SQLExceptionTranslator
不符合我的需要,因为我无法确定是哪个方法导致了异常。
我有这样的存储库:
public interface UserRepository extends JpaRepository<UserEntity, Integer> {
@ErrorCode("E1000")
User findById(int id);
@ErrorCode("E1001")
User findByUsername(String username);
}
ErrorCode
是一个自定义注释,其中包含一个错误代码,每当 DataAccessException
发生时我都需要将其发送给客户端。
如果有一种方法可以通过捕获 DataAccessException
来拦截对 findById
的调用,那么很容易从注释中提取错误代码并重新抛出可以被捕获的自定义异常异常处理程序。
如果允许Spring AOP,您可以构建自己的切面,例如:
@Aspect
public class ErrorCodeAspect {
@Around("@annotation(errorCode)")
public Object aroundErrorCode(ProceedingJoinPoint joinPoint, ErrorCode errorCode) throws Throwable {
try {
return joinPoint.proceed();
} catch (DataAccessException dae) {
throw new YourCustomException(errorCode.value(), dae);
}
}
}
请注意,接口方法上的注释 不是 通过实现 class 方法继承的(即使 @Inherited
适用于父 classes),因此您可能需要注释您的具体服务 classes 而不是要插入的方面(除非 Spring 对我不知道的存储库代理)。
您可以定义自定义 ExceptionHandler
。
@RestControllerAdvice
public class RestExceptionResolver {
@ExceptionHandler(DataAccessException.class)
public ResponseEntity<String> handleNoSuchElementException(DataAccessException ex) {
return ResponseEntity.status(yourErrorCode);
}
}