【问题标题】:How to handle Spring data exceptions in the repository layer如何在存储库层处理 Spring 数据异常
【发布时间】:2012-11-02 17:00:12
【问题描述】:

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

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

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

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

【问题讨论】:

  • 抛出这些异常的是存储库层(即存储库周围的 Spring 代理),所以我看不出如何在存储库层中捕获这些异常。到底有什么意义呢?
  • 尽可能接近原点处理异常。
  • 在这种情况下,这意味着在异常被抛出之前捕获它。您可以在服务层中捕获它们,但有什么意义呢?除了默认所做的事情(回滚事务并传播异常)之外,您还能做任何事情吗?
  • 如何在不使用 try/catch 块的情况下在服务层捕获它们?
  • 我不知道,因为我还是不明白你为什么要捕获异常。

标签: spring exception-handling


【解决方案1】:

可以使用 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;
    }
}

在您的应用程序上下文文件中添加以下 sn-p

<aop:aspectj-autoproxy />    
<bean id="daoExceptionHandler" class="com.xyz.advice.DaoExceptionHandlerAdvice"  ></bean>

查看以下链接了解详情 - Spring AOP

第二个选项

我没有尝试过,但使用异常翻译器可能更容易。您可能可以扩展 HibernateExceptionTranslator 并在其中拥有自己的逻辑。

点击此链接了解详情 - Exception Translation

【讨论】:

  • 谢谢。我一直在思考这个方向(aop),你的回答告诉我没有其他解决方案。对于这个问题,“你打算用这个做什么”?老实说,我认为存储库层可以从中恢复一些异常 (static.springsource.org/spring/docs/2.0.x/reference/dao.html)。当您如此强烈地坚持让异常传播到控制器层时,我遇到了第二个难题。目前我只是想为我的应用程序设置一个“模板”。
  • 您是对的,除非您有特定类型的异常或要从异常中恢复的特定场景,否则不需要在存储库层捕获它。您可以通过在服务层中添加“catch”块来处理这几个场景。如果您仍想添加通用异常处理程序,请务必查看我在回答中提到的“异常转换器”选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多