Spring:AOP:使用Proxy时无法处理Exception

时间:2013-06-06 10:02:33

标签: spring aspectj spring-aop

在将异常写入控制台/日志之前,我无法捕获异常。

我在弹簧配置中有以下内容。

<bean id="loggingTxAdvice" class="com.acme.LoggingEngine"/>

<aop:aspectj-autoproxy/>
<aop:spring-configured/>

<aop:config>

<aop:advisor id="loggingTxService" advice-ref="loggingTxAdvice" pointcut="execution(* uk.co.acme.service.*.*(..))" />

<aop:advisor id="loggingTxDao" advice-ref="loggingTxAdvice" pointcut="execution(* uk.co.acme.dao.*.*(..))" />

<aop:advisor id="loggingTxSecurity" advice-ref="loggingTxAdvice"  pointcut="execution(* uk.co.acme.security.*(..))" />

</aop:config>

现在我有了

AcmeAction.doSomething(){
    try{
       AcemeService.doService():

     }catch(FunctionalException fe){
       LogHelper.logConditionally...
     } 
}

AcmeService{

  doService() throws FunctionalException{
     AcmeDao.doDao();
  }

}

AcmeDao{

  doDAO() throws FunctionalException{
     if(someCondition){
         throw new FunctionalException();

      }

}

问题是,在 AcmeAction.doSomething LogHelper.logConditional 之前,会有大量的堆栈跟踪打印到日志/控制台。

我不需要抛出到控制台的那些异常,而是需要有条件地记录它们,这就是我使用LogHelper.logConditional处理它们的原因。

我甚至在com.acme.LoggingEngine

中有条件
class com.acme.LoggingEngine implements MethodInterceptor, ThrowsAdvice, Serializable {

    public void afterThrowing(Method m, Object[] args, Object target, Throwable ex) {
       ......
     if (ex instanceof FunctionalException) {
        LogHelper.logConditionally(....);
     } 
        .......
}

上面的代码只能处理和打印有条件的信息,但仍然会打印出一堆堆栈跟踪(这是我试图压制的),但从不起作用。 为什么会这样?我怎么能处理这个?任何帮助都将受到高度赞赏。

堆栈跟踪

at uk.co.acme.AcmeDAO.getQuote(AcmeDAO.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:124)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at uk.co.acme..util.LoggingEngine.invoke(LoggingEngine.java:72)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy108.getQuote(Unknown Source)
at uk.co.acme.AcmeService.getQuote

其他信息

在单步执行代码后,我看到ThrowsAdviceInterceptor#invoke正在重新抛出,这就是打印异常的原因。如何防止ThrowsAdviceInterceptor这样做?因为我已经有了LoggingInterceptor(LoggingEngine)?

1 个答案:

答案 0 :(得分:0)

进入代码后,我发现问题出在我的代码中:

LogHelper.logConditionally

这是打印错误而不是警告。

感谢所有评论。