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