问题描述
我必须在到达服务层之前做一些预处理,并对预处理过的数据做一些进一步的操作。基本上,我想在 @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
的建议,我似乎有两个问题/疑虑:
-
after 部分的代码只有在服务中没有异常时才应该运行。有了上面的代码结构,我想,它应该可以正常工作。如果我错了,请纠正我。
-
定义了一个更高优先级的方面来处理异常
@AfterThrowing
建议。我不明白,有了这个设置,上面代码中的异常处理能正常工作吗?如果不是的话,我想我必须退回到在aspect中定义两个通知
@Before
和@AfterReturning
的选项,并在ThreadLocal的帮助下在这两者之间共享数据变量。
有人可以帮忙吗?谢谢。
解决方法
- after 部分的代码只有在服务中没有异常时才应该运行。有了上面的代码结构,我猜,它 应该工作正常。如果我错了,请纠正我。
这会正常工作
- 定义了一个更高优先级的方面来处理带有@AfterThrowing 建议的异常。我无法理解, 使用此设置,上述代码中的异常处理是否有效 美好的?如果不是那么,我想我不得不退回到 在方面和中定义两个通知@Before 和@AfterReturning 在 ThreadLocal 的帮助下共享这两者之间的数据 变量。
这里的问题是,当您不做任何事情时,为什么要捕获异常?您可以删除 try/catch。