Перехват исключения времени выполнения Spring с помощью Spring AOP

Для целей ведения журнала мы пытаемся поймать различные исключения среды выполнения Spring через собственный AOP Spring, и я должен сказать, что мне это не удалось, поэтому я был бы признателен за любые идеи относительно того, как к этому подойти.

Я пробовал что-то вроде этого:

@Aspect
@Component
public class SomeAspect {

@AfterThrowing(pointcut = "execution(* org.springframwork.oxm..*(..))", throwing = "exception")
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
public void adviseSpringErrorEvents(JoinPoint joinPoint, final UnmarshallingFailureException exception) throws Throwable {

         LOG.debug(this.getClass().getSimpleName() + " - Error message advice fired on method: " + joinPoint.getSignature().getName());
     }
}

Класс автоматически проксируется, и остальные советы в классе аспекта срабатывают правильно, поэтому должна быть проблема с выражением AspectJ.

ОБНОВЛЕНИЕ: код внутри метода не запускается, и я не собираюсь ловить исключение в совете.

Есть идеи? Спасибо заранее.

P.S. Версия фреймворка Spring — 3.0.6.


person quantum    schedule 10.04.2012    source источник
comment
Вы имеете в виду под неудачей, что этот код даже не запускается или что он не перехватывает исключение? - потому что, если вы хотите остановить распространение исключения, вместо этого вам понадобится @AroundAdvice.   -  person krock    schedule 10.04.2012
comment
Этот код даже не запускается. Отладчик не останавливается в точке останова внутри данного метода.   -  person quantum    schedule 10.04.2012


Ответы (1)


Вот несколько вещей, которые выделяются для меня:

  1. Ваша точка сокращения предназначена для пакета spring, в котором находится исключение, которое вы пытаетесь поймать, оно должно быть там, где вы пытаетесь присоединиться к execution(* com.mypackage..*(..)).
  2. Вы выбрасываете метаданные, но вам не нужно объявлять что-либо выбрасываемым. Уведомляемое исключение не будет распространяться через этот код.

Что попробовать:

  1. Разверните параметр исключения до Exception. Возможно, искомое вами исключение находится в другой иерархии.
  2. Расширьте pointcut до * уровня пакета, но, вероятно, лучше не делать и 1, и 2 одновременно.
  3. Увеличьте ведение журнала до более серьезного уровня, чтобы быть уверенным, что он не будет поглощен вашей структурой ведения журнала.
person krock    schedule 10.04.2012
comment
Да, я пробовал эти вещи еще до того, как разместил вопрос, однако мне не удалось спровоцировать совет на выстрел. Может быть, Maven играет с моим путем к классам, и я просто не вижу, что происходит. Завтра попробую кое-что сделать, если получится, дам знать. - person quantum; 10.04.2012
comment
Я думаю, что основная проблема заключается в том, что ваш pointcut предназначен для пакета org.springframework.oxm, и я сомневаюсь, что это то, что вам нужно, это должен быть пакет для вашего кода. - person krock; 10.04.2012
comment
Именно мои мысли - вот почему я сначала начал с чего-то вроде выражения com.mypackage..*(..), но, поскольку это не сработало, я решил - давайте перехватим исключение, когда оно возникло, и это должен быть пакет Spring OXM. - person quantum; 10.04.2012
comment
Ваша точка присоединения должна быть bean-компонентом Spring, находящимся в контексте вашего приложения, и, по предположению, материал в org.spring framework.oxm, вероятно, не будет сам по себе bean-компонентом Spring. Вы можете проверить это, поместив в этот пакет Before или AfterAdvice, чтобы увидеть, вызывается ли он когда-либо. - person krock; 10.04.2012
comment
Это верный момент. Итак, можем ли мы заключить, что единственный способ перехватить исключения времени выполнения Spring — это внутри наших компонентов Spring? Нет других, подлых способов добиться этого с помощью АОП? - person quantum; 10.04.2012
comment
Если вы настроили один из oxm marshallers в своем контексте Spring, вы сможете использовать его в качестве точки соединения и видеть исключения, которые выбрасываются оттуда. Я раньше не использовал oxm, но возможно, что эти исключения генерируются через слои, к которым вы не можете присоединиться. Вместо этого рассмотрите возможность увеличения уровня ведения журнала в самом пакете oxm. - person krock; 11.04.2012
comment
давайте продолжим обсуждение в чате - person quantum; 11.04.2012
comment
Спасибо за ваше время и ваши усилия - я забыл принять ваш ответ. Еще не было времени основательно подумать о проблеме перехвата исключений во время выполнения с помощью АОП, но если у меня будет время, я отпишусь здесь. - person quantum; 21.05.2012