Spring 启动应用程序中@Around 建议中的异常处理

问题描述

我有一个用例如下:

我必须在到达服务层之前做一些预处理,并对预处理过的数据做一些进一步的操作。基本上,我想在 @Before@AfterReturning 的建议之间共享处理后的数据。

在这里浏览了各种帖子,这似乎是使用 @Around 实现这一目标的最佳方式,否则,我必须创建一个类级属性来捕获两个不同建议之间的数据,而且,我必须处理线程安全。

因此生成代码片段将如下所示:

    @Aspect
    public class MyAspect {
         
        @pointcut("@within(org.springframework.stereotype.Service)")
        public void applicationservicepointcut() {
            
        }

        @Around(value = "applicationservicepointcut()")
        public Object process(ProceedingJoinPoint joinPoint) throws Throwable {
                //Before section
                ... some preprocessing...

                
                try {
                    Object result = joinPoint.proceed();
                    //After section
                     ...save preprocessed data in db...

                     return result;
                 } catch(Exception e) {
                     throw e;
                 }
        }
    }

但根据 @Around 的建议,我似乎有两个问题/疑虑:

  1. after 部分的代码只有在服务中没有异常时才应该运行。有了上面的代码结构,我想,它应该可以正常工作。如果我错了,请纠正我。

  2. 定义了一个更高优先级的方面来处理异常 @AfterThrowing 建议。我不明白,有了这个设置,上面代码中的异常处理能正常工作吗?

    如果不是的话,我想我必须退回到在aspect中定义两个通知@Before@AfterReturning的选项,并在ThreadLocal的帮助下在这两者之间共享数据变量。

有人可以帮忙吗?谢谢。

解决方法

  1. after 部分的代码只有在服务中没有异常时才应该运行。有了上面的代码结构,我猜,它 应该工作正常。如果我错了,请纠正我。

这会正常工作

  1. 定义了一个更高优先级的方面来处理带有@AfterThrowing 建议的异常。我无法理解, 使用此设置,上述代码中的异常处理是否有效 美好的?如果不是那么,我想我不得不退回到 在方面和中定义两个通知@Before 和@AfterReturning 在 ThreadLocal 的帮助下共享这两者之间的数据 变量。

这里的问题是,当您不做任何事情时,为什么要捕获异常?您可以删除 try/catch。