2017-09-25 5 views
0

Problèmesortie inattendue lors de l'écriture d'un programme aop printemps

sortie inattendue lors de l'exécution d'une application simple Aop.

Tâche je l'ai fait:

1) J'ai créé une classe Camera et une classe Logger. La classe Camera a une méthode snap() et la classe Logger a une méthode takePhoto().

public class Camera { 
    public void snap(){ 
    System.out.println("SNAP"); 
    } 
} 

public class Logger { 
    public void takePhoto(){ 
    System.out.println(" About to take photo ... "); 
    } 
} 

2) J'ai configuré le pointcut, l'aspect et le conseil dans mon fichier beans.xml.

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:aop="http://www.springframework.org/schema/aop" 
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 


<bean id="camera" class="com.jalaj.spring.aop.Camera"></bean> 
<bean id="logger" class="com.jalaj.spring.aop.Logger"></bean> 
<aop:config> 
    <aop:pointcut 
     expression="execution(void com.jalaj.spring.aop.Camera.snap())" 
     id="camerasnap" /> 
    <aop:aspect id="logger" ref="loggeraspect"> 
     <aop:before method="takePhoto" pointcut-ref="camerasnap" /> 
    </aop:aspect> 
</aop:config> 
</beans> 

3) Test App pour charger le fichier de configuration

public static void main(String[] args) { 
    ApplicationContext context = new ClassPathXmlApplicationContext("/com/jalaj/spring/aop/beans.xml"); 
    Camera p=(Camera)context.getBean("camera"); 
    p.snap(); 
    ((AbstractApplicationContext) context).close(); 

} 

4) J'ai inclus les pots donnés dans mon fichier pom.xml

<dependencies> 
    <dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-core</artifactId> 
    <version>4.1.6.RELEASE</version> 
    </dependency> 
    <dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>3.8.1</version> 
    <scope>test</scope> 
    </dependency> 
    <dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-beans</artifactId> 
    <version>4.1.6.RELEASE</version> 
    </dependency> 
    <dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-context</artifactId> 
    <version>4.1.6.RELEASE</version> 
    </dependency> 
    <dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aspects</artifactId> 
    <version>3.2.4.RELEASE</version> 
    </dependency> 

    <dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjrt</artifactId> 
    <version>1.7.3</version>  
    </dependency> 
    <dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjweaver</artifactId> 
    <version>1.7.3</version> 
    </dependency> 
    <dependency> 
    <groupId>aspectj</groupId> 
    <artifactId>aspectjweaver</artifactId> 
    <version>1.5.4</version> 
    </dependency> 
    <dependency> 
    <groupId>cglib</groupId> 
    <artifactId>cglib</artifactId> 
    <version>2.2</version> 
    </dependency> 
    <dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aop</artifactId> 
    <version>4.2.4.RELEASE</version> 
    </dependency> 
</dependencies> 

Aussi, j'ai vu questions précédentes, mais je ne suis pas en mesure de trouver la bonne solution.

Quelqu'un peut-il me guider comment résoudre correctement ce problème?

Résultats escomptés

About to take photo ... 
SNAP 

sortie Montré

Exception encountered during context initialization - cancelling refresh attempt 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'camera' defined in class path resource [com/jalaj/spring/aop/beans.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Cannot create inner bean '(inner bean)#5852765b' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#5852765b': Cannot create inner bean '(inner bean)#43350d11' of type [org.springframework.aop.config.MethodLocatingFactoryBean] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#43350d11': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'loggeraspect' is defined 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:472) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
at com.jalaj.spring.aop.AppTest.main(AppTest.java:9) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Cannot create inner bean '(inner bean)#5852765b' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#5852765b': Cannot create inner bean '(inner bean)#43350d11' of type [org.springframework.aop.config.MethodLocatingFactoryBean] while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#43350d11': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'loggeraspect' is defined 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:313) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129) 
at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:648) 
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:140) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1139) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1042) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) 
at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:92) 
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:101) 
at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:103) 
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:248) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:984) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:955) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:466) 
... 10 more 
+1

Il est dans les journaux ... ne peut pas trouver l'aspect logger comme un haricot, vous n'avez pas un tel haricot avec ce nom. – Fernando

+1

Arrête de mélanger les versions de cadre. Vous mélangez Spring 3.2, 4.1 et 4.2 ainsi que AspectJ 1.5 et 1.7. Enfin, votre 'ref' devrait pointer vers' logger' car c'est l'identifiant de votre aspect. –

+0

@ M.Deinum Je vous remercie –

Répondre

1

ref fait référence à la id d'un haricot, il semble que ce que vous voulez est:

<aop:aspect id="loggeraspect" ref="logger"> 

au lieu de

<aop:aspect id="logger" ref="loggeraspect">