Я не могу отловить исключения до того, как они будут записаны в консоль/журнал.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)?
Можете ли вы опубликовать трассировку стека с начала – Atul
Это выглядит хорошо для меня в целом, однако я не вижу, где вы определяете 'loggingTxAdvice'. –
@ Атул это с самого начала. – avijendr