我正在使用 Spring 编写一个 REST 应用程序。它分为3层,控制器,服务和存储库。
存储库层使用 Spring 数据和 MongoDb。来自 MongoDb 的异常被转换为 Spring Data 异常。
使用 @ExceptionHandler 注释我试图在存储库层中捕获这些异常。这没有用。使用@ExceptionHandler 捕获异常的唯一方法是将代码放在控制器层中。
有没有办法让我在不使用 try/catch 块的情况下捕获和处理存储库层中的异常。
我正在使用 Spring 编写一个 REST 应用程序。它分为3层,控制器,服务和存储库。
存储库层使用 Spring 数据和 MongoDb。来自 MongoDb 的异常被转换为 Spring Data 异常。
使用 @ExceptionHandler 注释我试图在存储库层中捕获这些异常。这没有用。使用@ExceptionHandler 捕获异常的唯一方法是将代码放在控制器层中。
有没有办法让我在不使用 try/catch 块的情况下捕获和处理存储库层中的异常。
可以使用 Spring AOP 并为您的所有 DAO 方法创建一个 @Around 建议来完成,如下所示。
但是我仍然想了解您打算在 catch 块中做什么。您是否计划使用不同的逻辑来处理不同类型的数据访问异常?如果您没有任何特定的逻辑,那么让异常传播到控制器层是有意义的。
第一个选项
这是一个示例 -
@Aspect
public class DaoExceptionHandlerAdvice {
@Around("execution( * com.xyz.daos.*.*(..))")
public Object invokeService(ProceedingJoinPoint pjp) throws Throwable{
MethodSignature methodSignature = (MethodSignature)pjp.getSignature();
Object returnValue = null;
try {
returnValue = pjp.proceed();
}
catch(Exception e){
// handle the exception
}
finally{
}
return returnValue;
}
}
在您的应用程序上下文文件中添加以下代码段
<aop:aspectj-autoproxy />
<bean id="daoExceptionHandler" class="com.xyz.advice.DaoExceptionHandlerAdvice" ></bean>
查看以下链接了解详细信息 - Spring AOP
第二种选择
我没有尝试过,但使用异常翻译器可能会更容易。您可能可以扩展 HibernateExceptionTranslator 并在其中拥有自己的逻辑。
点击此链接了解详情 - 异常翻译