Spring,Aspect J,多个AfterThrowing建议应用于同一个切入点

时间:2010-12-09 18:16:59

标签: spring aspectj

是否可以将两个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',我确信我已经做了一件让人感到羞耻的事情,但我不确定是否有更好的方法来解决这个问题而没有它呢?

我也反对将我预期的自定义异常转换为已检查的异常,然后将Runtime异常捕获为catch all,这可能是一个解决方案。

2 个答案:

答案 0 :(得分:0)

前段时间我写了类似的方面,最后我使用了“实例”。我不认为这有问题。

答案 1 :(得分:0)

我不太确定......但只是想知道你的最后(第三)建议是否可以用以下方式编写

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条建议。