【问题标题】:Spring, Aspect J, multiple AfterThrowing advice applied to the same pointcutSpring,Aspectj,多个 AfterThrowing 建议应用于同一切入点
【发布时间】:2011-05-23 01:06:27
【问题描述】:

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

我想翻译 runtime 异常(自定义和标准 java 异常)被排除在服务层之外,在某些情况下我会进行一些特定的翻译,然后有一个包罗万象的类型片段翻译任何真正意想不到的东西的建议:

@AfterThrowing(pointcut = "执行(* com.my.company.api.*(..))", throwing = "rnfex") 公共无效doTranslationAction(ResourceNotFoundException rnfex){ // 抛出带有 Status.NOT_FOUND 的新 WebApplicationException; } @AfterThrowing(pointcut = "执行(* com.my.company.api.*(..))", throwing = "aex") 公共无效doTranslationAction(AuthorisationException aex){ // 抛出带有 Status.NOT_AUTHORISED 的新 WebApplicationException; } @AfterThrowing(pointcut = "执行(* com.my.company.api.*(..))", throwing = "throwable") 公共无效doTranslationAction(Throwable throwable){ // 在此处记录有关此意外异常的信息 // 抛出带有 Status.INTERNAL_SERVER_ERROR 的新 WebApplicationException }

我发现在这种情况下,如果我抛出一个明确满足的异常,然后调用正确的方法,就会抛出一个翻译后的异常,然后被更广泛的“Throwable”建议捕获,然后再次翻译成包罗万象的 INTERNAL_SERVER_ERROR WAE。这并不意外,但并不是我想要的。

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

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

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

【问题讨论】:

    标签: spring aspectj


    【解决方案1】:

    不久前我写了一个类似的方面,最后我使用了“instance of”。我认为这没有问题。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多