2013-06-06 42 views
0

我無法在將異常寫入控制檯/日誌之前捕獲異常。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.doSomethingLogHelper.logConditionally堆跡線的負載被輸出到日誌/控制檯之前。

我不需要那些拋出控制檯的異常,而是需要有條件地記錄它們,這就是爲什麼我使用LogHelper.logConditionally處理它們的原因。

我甚至有一個條件在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#調用重新投擲,這就是爲什麼例外是打印。如何防止ThrowsAdviceInterceptor做到這一點?因爲我已經有我的LoggingInterceptor(LoggingEngine)?

+0

你可以發佈堆棧跟蹤從開始 – Atul

+1

它看起來不錯,但我不知道你在哪裏定義'loggingTxAdvice'。 –

+0

@Atul從一開始就是這樣。 – avijendr

回答

0

步入代碼後,我發現,這個問題是我的代碼裏面:

LogHelper.logConditionally 

它是打印錯誤,而不是警告。

感謝您的所有意見。