2012-04-10 41 views
4

为了记录的目的,我们试图通过Spring自己的AOP来捕捉各种Spring的运行时异常,我必须说我一直不成功,所以我会很感激任何想法如何处理。Catch Spring运行时异常与春天AOP

我已经试过这样的事情:

@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()); 
    } 
} 

该类autoproxied和建议的方面类,其余正确触发,所以必须有与AspectJ的表达有问题。

更新:该方法内的代码不运行,它不是我的意图在通知中捕获异常。

任何想法? Thx提前。

P.S. Spring框架版本是3.0.6。

+0

你的意思是不成功,这段代码甚至没有运行,或者它没有捕获异常? - 如果您想停止传播异常,则需要@AroundAdvice。 – krock 2012-04-10 12:46:44

+0

这段代码甚至没有运行。调试器不会停止在给定方法内的断点处。 – quantum 2012-04-10 12:53:11

回答

2

这里有两件事是站出来对我说:

  1. 你的切入点是为例外,你试图抓住它是在春天包,它应该是你正试图加入execution(* com.mypackage..*(..))
  2. 你抛出throwable,但你不需要声明任何被抛出。建议的异常不会通过此代码传播。

事情尝试:

  1. 展开你的异常参数Exception。也许您正在寻找的异常处于不同的层次结构中。
  2. 将切入点扩展到*包级别 - 但可能最好不要同时执行1和2。
  3. 将日志记录增加到更严重的级别以确保它不会被日志框架吞噬。
+0

是的,甚至在我发布这个问题之前,我已经尝试了这些东西,但是,我没有管理激发建议进行射击。可能是Maven正在用我的classpath玩弄技巧,而我只是看不到发生了什么。我明天会尝试一些技巧 - 如果我设法解雇它,我会让你知道的。 – quantum 2012-04-10 14:05:05

+0

我认为主要的问题是你的切入点是针对org.springframework.oxm包的,我怀疑这是你想要的,它应该是你的代码包。 – krock 2012-04-10 14:08:14

+0

我的想法正是 - 这就是为什么我首先开始使用类似'com.mypackage .. *(..)'表达式的东西,但是因为这样做不起作用,我想 - 让我们截取我们正在抛出的异常那必须是Spring的OXM软件包。 – quantum 2012-04-10 14:28:33