2013-06-06 4 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(); 

     } 

} 

Проблема заключается в том, прежде чем он достигнет LogHelper.logConditionally из AcmeAction.doSomething а нагрузки трассировки стека печатаются в журнале/консоли.

Мне не нужны эти исключения для брошенных на консоль, скорее мне нужно их условно зарегистрировать, поэтому я обрабатываю их с помощью 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(....); 
    } 
     ....... 
} 

Приведенный выше код работает и печатает только условно информацию, но все-таки нагрузка stacktraces отпечатаны (то, что я пытаюсь подавлять), но никогда не работает. Почему так? Как я могу справиться с этим? Любая помощь будет высоко оценен.

трассировки стека

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)?

+0

Можете ли вы опубликовать трассировку стека с начала – Atul

+1

Это выглядит хорошо для меня в целом, однако я не вижу, где вы определяете 'loggingTxAdvice'. –

+0

@ Атул это с самого начала. – avijendr

ответ

0

После заходя в коде, я обнаружил, что этот вопрос был в моем коде:

LogHelper.logConditionally 

Это была ошибка печати вместо предупредить.

Спасибо за все комментарии.

Смежные вопросы