spring - 如何在repository层处理Spring数据异常

标签 spring exception

我正在使用 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/

相关文章:

java - 如何故意抛出错误来测试数据库回滚?

java - 如何纠正数组索引越界异常

java - 在 Spring MVC/Security 中设置和读取 cookie

java - 使用 Lombok 记录器记录时有没有办法屏蔽类值?

c# - 创建带有捕获异常信息的 Windows 窗体?

java - 为什么 NPE 有效但异常和 FileNotFoundException 无效

exception - FSharpTypeFunc.Specialize 导致 TypeLoadException

java - 我如何将一个 bean 合并到另一个 bean 中以进行部分更新

java - 缓存刷新显示带有@cacheable 注释的错误

spring - grails.gorm.transactions.Transactional不回滚