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

Spring,Aspect J,多个后置建议应用于同一切入点,spring,aspectj,Spring,Aspectj,是否可以将两条后续通知应用于受特定异常类型限制的同一切入点,其中一个异常是另一个异常的超类,在捕获子类的情况下,仅执行一条通知 我想翻译从服务层中剔除的运行时异常(自定义和标准java异常),在服务层中,我会在某些情况下进行一些特定的翻译,然后有一条全面的建议来翻译任何真正意想不到的内容: @AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "rnfex") public void doTra

是否可以将两条后续通知应用于受特定异常类型限制的同一切入点,其中一个异常是另一个异常的超类,在捕获子类的情况下,仅执行一条通知

我想翻译从服务层中剔除的运行时异常(自定义和标准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 } @后throwing(pointcut=“execution(*com.my.company.api.*(…)”,throwing=“rnfex”) public void dotranslation(ResourceNotFoundException rnfex){ //抛出状态为的新WebApplicationException。未找到; } @后置(pointcut=“execution(*com.my.company.api.*(…)”),抛出=“aex”) 公共无效数据传输(授权例外aex){ //抛出状态为的新WebApplicationException.NOT_Authorized; } @后throwing(pointcut=“execution(*com.my.company.api.*(…)”,throwing=“throwable”) 公共无效数据转换(可丢弃可丢弃){ //在此处记录有关此意外异常的内容 //抛出状态为的新WebApplicationException.INTERNAL_SERVER_错误 } 我发现在这种情况下,如果我抛出一个显式满足的异常,然后调用正确的方法,就会抛出一个已翻译的异常,然后由更广泛的“Throwable”通知捕获,然后再次转换为catch all INTERNAL_SERVER_ERROR WAE。这并不意外,但并不完全是我想要的

为了解决这个问题,我得到了一条建议,它捕获了所有可丢弃的类型,然后使用“instanceof”确定这是否是一个预期的自定义运行时异常,我可以将其转换为特定的WAE

如果我看到“instanceof”,我肯定我做了一些让我感到羞耻的事情,但是我不确定没有它,是否有更好的方法来解决这个问题


我还反对将预期的自定义异常转换为已检查的异常,然后将运行时异常捕获为“全部捕获”,这可能是一种解决方案。

我不久前写了一个类似的方面,最后使用了“的实例”。我不认为这有什么问题。

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

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