Spring AOP и перехват исключений - PullRequest
7 голосов
/ 01 декабря 2011

Я пытаюсь настроить 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 pointcut (вместо execution), поскольку - согласно Spring docs - кажется, что target позволяет мне указывать типисключение для сопоставления, но я не уверен, что это неправильно или как должен выглядеть мой атрибут pointcut.

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

Ответы [ 2 ]

8 голосов
/ 02 декабря 2011

Я бы использовал элемент <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>

The throwing атрибут - это имя параметра метода обработчика аспекта (здесь это LogException.logIt), который вызывается при исключении:

Aspect

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

XMLи метод combo определяет тип исключения, к которому применяется аспект.В этом примере ThrowingClass выбрасывает AnException и AnotherException.Только AnException будет применять совет из-за сигнатуры метода совета.

См. Пример проекта на github для полного источника .

1 голос
/ 02 декабря 2011

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

...