Spring,Aspect J,将多个AfterThrowing建议应用于同一个切入点
是否可以将两个AfterThrows通知应用于由特定Exception类型限制的同一个切入点,其中一个例外是另一个的超类,在捕获子类的情况下,只有一个通知正在执行?
我想翻译运行时异常(包括自定义和标准java),在某些情况下我会做一些特定的翻译,然后有一个全面的类型的建议来翻译任何真正意想不到的错误:
@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "rnfex") public void doTranslationAction(ResourceNotFoundException rnfex) { // throw new WebApplicationException with Status.NOT_FOUND; } @AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "aex") public void doTranslationAction(AuthorisationException aex) { // throw new WebApplicationException with Status.NOT_AUTHORISED; } @AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "throwable") public void doTranslationAction(Throwable throwable) { // Log something here about this unexpected exception // throw new WebApplicationException with Status.INTERNAL_SERVER_ERROR }
我发现在这种情况下,如果我抛出一个明确地被迎合的异常,然后调用正确的方法,就会抛出一个已翻译的异常,然后由更广泛的“Throwable”建议捕获该异常,然后再次翻译成全面的INTERNAL_SERVER_ERROR WAE。 这并不出乎意料,但不是我所期待的。
为了解决这个问题,我得到了一个可以捕获所有Throwable类型的建议,然后使用'instanceof'来决定这是否是一个预期的自定义运行时异常,我可以将其转化为特定的WAE。
如果我看到'instanceof',我肯定我做了一些事情会感到羞愧,但我不确定是否有更好的方法解决这个问题,而没有它?
我也反对将我期望的自定义异常转换为检查异常,然后捕获运行时异常作为catch all,这可能是一个解决方案。
我前段时间写了一个类似的方面,最后我使用了“实例”。 我认为这没有问题。
我不太确定...但只是想知道你的最后(第三)建议是否可以用下面的方式编写
execution( * com.my.company.api..*(..)) and !execution( * com.my.company.api.XyzAspect..*(..))
public void doTranslationAction(Throwable throwable) {
// Log something here about this unexpected exception
// throw new WebApplicationException with Status.INTERNAL_SERVER_ERROR
}
其中XyzAspect.java是@Aspect类,在这里你正在写这3个建议。
链接地址: http://www.djcxy.com/p/77245.html上一篇: Spring, Aspect J, multiple AfterThrowing advice applied to the same pointcut
下一篇: Spring AOP pointcut that matches annotation on interface