2012-03-28 8 views
5

Chcę przechwycić wyjątki zgłaszane przez klasy implementujące interfejs Processor. W aspekcie potrzebuję dostępu do procesora, który zgłasza wyjątek. I zdefiniować następujące punktu przekroju:Spring AOP: przekazywanie celu do Aspect

@Pointcut("target(some.package.Processor) && args(message)") 
    public void processor(Message message) { 
} 

I aspekt: ​​

@AfterThrowing(pointcut="processor(message)", throwing="ex") 
public void onExceptionInProcessor(Processor target, Exception ex, Message message) { 
    // code skipped 
} 

Jednak uzyskać następujący wyjątek:

Caused by: java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut 
    at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301) ~[aspectjweaver-1.6.12.jar:1.6.12] 
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:193) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:182) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:163) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:209) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:263) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:295) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:117) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:87) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:68) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:359) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322) ~[spring-aop-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407) ~[spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1461) ~[spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) ~[spring-beans-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    ... 58 common frames omitted 

Co to jest poprawny sposób wiążący docelową obiekt do aspektu? Jedynym sposobem, znalazłem jest wiążąca JoinPoint, ale proponuje następujące:

chyba że wyraźnie potrzebują tego odblaskową dostępu, należy użyć Desygnator docelowego punktu przekroju, aby dostać się w tym obiekcie do lepszego typowania statycznego i wydajność

Czy ktoś ma jak to zrobić?

Odpowiedz

7

Twoja target powinna odnosić się do jednej z nazw parametrów w metodzie. Na przykład mówiąc

@Pointcut("target(myProc) && args(message)") 
public void processor(Processor myProc, Message message) { 
} 

daje Processor typu w bezpieczny sposób w myProc zmiennej.

+0

Dzięki, to działa! – kazaand

+0

Nie ma problemu. Up-vote byłoby miłe. – vertti

+0

Wygląda na to, że cel (x) również musi być określony jako pierwszy w adnotacji, ale niekoniecznie w argumentach –