2014-01-29 26 views
2

我能夠獲得@annotation切入點工作以滿足我的基本需求。將註釋對象綁定到建議主體

@Pointcut ("@annotation(path.to.my.CustomAnnotation)") 
public void actionAnnotatedPointCut() {} 

但是當我嘗試將其綁定到的意見身體像下面,我得到了IllegalArgumentException

@Pointcut ("@annotation(customAnnotation)") 
public void actionAnnotatedPointCut(CustomAnnotation customAnnotation) {} 

例外:

Caused by: java.lang.IllegalArgumentException: error at ::0 incompatible number of arguments to pointcut, expected 1 found 0 

完全跟蹤:

Jan 29, 2014 9:45:29 PM org.apache.catalina.core.ApplicationContext log 
INFO: Initializing Spring root WebApplicationContext 
Jan 29, 2014 9:45:29 PM org.apache.catalina.core.StandardContext listenerStart 
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.context.annotation.internalPersistenceAnnotationProcessor': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 incompatible number of arguments to pointcut, expected 1 found 0 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:381) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:293) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934) 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526) 
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:850) 
    at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:724) 
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:493) 
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1274) 
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:296) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1337) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: java.lang.IllegalArgumentException: error at ::0 incompatible number of arguments to pointcut, expected 1 found 0 
    at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301) 
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:211) 
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:197) 
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:186) 
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:166) 
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:208) 
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:262) 
    at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:294) 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:118) 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:88) 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:372) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:335) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:421) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1558) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    ... 27 more 
Jan 29, 2014 9:45:29 PM org.apache.catalina.core.StandardContext start 
SEVERE: Error listenerStart 
Jan 29, 2014 9:45:29 PM org.apache.catalina.core.StandardContext start 
SEVERE: Context [/myApp] startup failed due to previous errors 

我使用了不恰當的切入點在這種情況下?

+0

請發佈完整的堆棧跟蹤。 –

+0

現在添加。 – mystarrocks

回答

5

看來錯誤在於你試圖結合切入點並參考actionAnnotatedPointCut

例如,您可能有

@Pointcut ("@annotation(path.to.my.CustomAnnotation)") 
public void actionAnnotatedPointCut() {} 

@Around("actionAnnotatedPointCut()") 
public Object doAround(ProceedingJoinPoint pjp) { 
    ... 
} 

這將很好地工作。

如果你改變你的切入點

@Pointcut ("@annotation(customAnnotation)") 
public void actionAnnotatedPointCut(CustomAnnotation customAnnotation) {} 

@annotation(..)表達通過名稱引用參數的方法。該參數的類型將用於建議用該類型註釋的方法。

現在,您的切入點結合了此切入點,在其對@Pointcut方法的引用中必須具有相同的參數名稱,並且必須具有適當類型的方法參數。

@Around("actionAnnotatedPointCut(customAnnotation)") 
public Object doAround(ProceedingJoinPoint pjp, CustomAnnotation customAnnotation) { 
    ... 
} 

這就是錯誤是說

incompatible number of arguments to pointcut, expected 1 found 0 

該公司預計一個參數,customAnnotation在我們的例子,但它缺少。

+0

太棒了!有用。雖然你所說的話有道理,但我一直認爲這些切入點組合只不過是符號而已。我無法在春季文檔中找到簽名至關重要的提示! – mystarrocks

+1

@mystarrocks [This](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-ataspectj-advice-params)應該解釋它。 –