我正在尝试配置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。
答案 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
会引发AnException
和AnotherException
。由于建议的方法签名,只有AnException
会应用建议。
答案 1 :(得分:1)
查看AfterThrowingAdvice。找到一个例子here(搜索“投掷建议后”),你会发现它。