我正在使用Spring编写REST应用程序。它分为3层,控制器,服务和存储库。
存储库层使用Spring数据和MongoDb。 MongoDb的例外转换为Spring Data例外。
使用@ExceptionHandler注释我试图在存储库层中捕获这些异常。这没用。使用@ExceptionHandler捕获异常的唯一方法是将代码放在控制器层中。
我有没有办法在不使用try / catch块的情况下捕获和处理存储库层中的异常。
答案 0 :(得分:4)
可以使用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并在那里拥有自己的逻辑。
请点击此链接了解详情 - Exception Translation