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>

У меня есть ощущение, что я должен использовать спецификатор pointcut target (вместо execution), поскольку, согласно Spring docs - кажется, что target позволяет мне указать тип исключения для сопоставления, но я не уверен, что это неправильно, или что должен выглядеть мой атрибут pointcut как.

Я бы настоятельно предпочел бы, чтобы конфигурация AOP выполнялась в XML (в отличие от Java/аннотаций, но я, вероятно, мог бы перевести решение на основе аннотаций в XML, если это необходимо.


person IAmYourFaja    schedule 01.12.2011    source источник


Ответы (2)


Я бы использовал элемент <aop:after-throwing> и его атрибут throwing.

Конфигурация Spring

<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 из-за сигнатуры метода совета.

Полный исходный код см. в примере проекта на github.

person Dave Newton    schedule 01.12.2011

Ознакомьтесь с AfterThrowingAdvice. Пример можно найти здесь (ищите "После броска совета") и вы найдете его.

person Andreas Wederbrand    schedule 01.12.2011