Spring AOP和异常拦截

时间:2011-12-01 19:30:01

标签: spring spring-aop

我正在尝试配置Spring,以便在抛出特定的异常子类(MyTestException)时执行建议:

public class MyTestExceptionInterceptor implements ThrowsAdvice {
    public void afterThrowing(Method method, Object[] args, Object target, Exception exc) {
        // I want this to get executed every time a MyTestException is thrown,
        // regardless of the package/class/method that is throwing it.
    }
}

XML配置:

<bean name="interceptor" class="org.me.myproject.MyTestExceptionInterceptor"/>

<aop:config>
  <aop:advisor advice-ref="interceptor" pointcut="execution(???)"/>
</aop:config>

我觉得我应该使用target切入点说明符(而不是execution),因为 - 根据Spring docs - 似乎target允许我要指定要匹配的异常类型,但我不确定这是否错误,或者我的pointcut属性需要看起来像什么。

非常更喜欢用XML完成AOP配置(而不是Java /注释,但如果需要,我可以将基于注释的解决方案转换为XML。

2 个答案:

答案 0 :(得分:8)

我使用<aop:after-throwing> element及其throwing属性。

春季配置

<bean name="tc" class="foo.bar.ThrowingClass"/>

<bean name="logex" class="foo.bar.LogException"/>

<aop:config>
  <aop:aspect id="afterThrowingExample" ref="logex">
    <aop:after-throwing method="logIt" throwing="ex"
                        pointcut="execution(* foo.bar.*.foo(..))"/>
  </aop:aspect>
</aop:config>

throwing属性是方面的处理程序方法的参数名称(此处为LogException.logIt),它在异常中被调用:

<强>方面

public class LogException {
    public void logIt(AnException ex) {
        System.out.println("*** " + ex.getMessage());
    }
}

XML和方法组合定义了方面适用的异常类型。在此示例中,ThrowingClass会引发AnExceptionAnotherException。由于建议的方法签名,只有AnException会应用建议。

See example project on github for full source

答案 1 :(得分:1)

查看AfterThrowingAdvice。找到一个例子here(搜索“投掷建议后”),你会发现它。