2015-10-16 1 views
0

Je crée un exemple d'application en utilisant Spring boot et maven. Le câblage automatique utilisant @Autowire ne fonctionne pas. Je reçois l'exception suivante:Spring Boot - Exception de création de Bean

[2015-10-16 16:39:51.233] boot - 3216 INFO [main] --- AnnotationConfigApplicationContext: Refreshing org.spring[email protected]5f0fd5a0: startup date [Fri Oct 16 16:39:51 IST 2015]; root of context hierarchy 
[2015-10-16 16:39:51.921] boot - 3216 WARN [main] --- AnnotationConfigApplicationContext: Exception encountered during context initialization - cancelling refresh attempt 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testApp': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.bean.TestBean com.test.TestApp.testBean; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.bean.TestBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) ~[spring-context-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) [spring-context-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE] 
at com.test.TestApp.main(TestApp.java:22) [classes/:?] 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.bean.TestBean com.test.TestApp.testBean; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.bean.TestBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] 
... 15 more 

TestApp.java

@SpringBootApplication 
@EnableAutoConfiguration 
public class TestApp { 

@Autowired 
private TestBean testBean; 

public static void main(String[] args) { 
    ApplicationContext context = SpringApplication.run(TestApp.class, args); 
    context.getBean(TestApp.class); 
    } 
} 

TestBean.java

@Component 
public class TestBean { 

@PostConstruct 
public void init() { 
    System.out.println("init from TestBean"); 
} 
private String name; 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
    } 
} 

Quelqu'un peut-il me aider?

+1

Pouvez-vous poster votre configuration Spring (XML ou Java)? Il semblerait que votre classe 'TestBean' ne soit pas connue à partir de Spring:' Aucun bean qualifié de type [com.bean.TestBean] trouvé'. Et quels sont les paquets de vos cours? –

+0

Je n'ai pas pu reproduire cela dans ma configuration, avez-vous configuré le démarrage en XML? – Saravana

+0

Je n'utilise aucun fichier de configuration xml. J'utilise seulement spring boot et maven –

Répondre

2

La valeur par défaut @SpringBootApplication active l'analyse des composants uniquement pour le package de la classe d'application et tous les sous-packages. Puisque le paquet de TestApp est com.test, et que le paquet de TestBean est com.bean, l'analyse des composants ne détectera pas la classe du bean.

Solution:
Si vous utilisez 1.2.x Spring Boot:

Soit ajouter l'annotation suivante à votre classe TestApp:

@ComponentScan({"com.test", "com.bean"}) 

ou déplacer le TestBean à un sous-paquet de com .test, par exemple com.test.bean

Si vous utilisez déjà Spring Boot 1.3.x:

Ajoutez le paramètre suivant à votre annotation @SpringBootApplication:

@SpringBootApplication(scanBasePackages = {"com.test", "com.bean"})  
+0

J'ai déplacé la classe 'TestBean' au paquet' com.test' et cela a fonctionné !! –

0

Il semble que Spring ne soit pas au courant de votre TestBean donc @Autowired ne le trouve pas dans le registre du bean.

Afin de rendre le travail @Autowired ajouter @ComponentScan après @EnableAutoConfiguration annotation.

Si vous avez défini TestBean dans your-app-context.xml essayer d'ajouter cette

@ImportResource(value={"your-app-context.xml"}) 

après @EnableAutoConfiguration annotation. Ainsi, par exemple, si votre-app-context.xml était dans le dossier META-INF/printemps situé dans src/main/ressources de votre projet Eclipse, la ligne correcte serait:

@ImportResource(value={"/META-INF/spring/your-app-context.xml"}) 

Il sera exposer tous les beans déclarés dans ce contexte à Spring Boot.

+0

Je n'utilise aucun fichier de configuration xml. J'utilise le démarrage de printemps. –

+0

Réponse mise à jour: essayez d'ajouter @ComponentScan – abarisone

+0

'@ SpringBootApplication' inclut déjà' @ ComponentScan'. – dunni