我正在使用 Spring 编写一个 REST 应用程序。它分为3层, Controller 、服务和存储库。
存储库层使用Spring数据和MongoDb。来自 MongoDb 的异常被转换为 Spring Data 异常。
使用 @ExceptionHandler 注释,我 try catch 存储库层中的这些异常。这不起作用。使用@ExceptionHandler捕获异常的唯一方法是将代码放在 Controller 层。
有没有办法让我在不使用 try/catch block 的情况下捕获并处理存储库层中的异常。
最佳答案
这可以通过 Spring AOP 并为所有 DAO 方法创建 @Around 建议来完成,如下所示。
但我仍然想了解您计划在 catch block 中做什么。您是否计划使用不同的逻辑来处理不同类型的数据访问异常?如果您没有任何特定的逻辑,那么让异常传播到 Controller 层是有意义的。
第一个选项
这是一个示例 -
@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 并在其中拥有自己的逻辑。
点击此链接了解详细信息 - Exception Translation
关于spring - 如何在repository层处理Spring数据异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13199834/