2

我正在使用 Spring 编写一个 REST 应用程序。它分为3层,控制器,服务和存储库。

存储库层使用 Spring 数据和 MongoDb。来自 MongoDb 的异常被转换为 Spring Data 异常。

使用 @ExceptionHandler 注释我试图在存储库层中捕获这些异常。这没有用。使用@ExceptionHandler 捕获异常的唯一方法是将代码放在控制器层中。

有没有办法让我在不使用 try/catch 块的情况下捕获和处理存储库层中的异常。

4

1 回答 1

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 并在其中拥有自己的逻辑。

点击此链接了解详情 - 异常翻译

于 2012-11-02T21:01:57.640 回答