1

I'm creating a sample application using using Spring boot and maven. The auto-wiring using @Autowire is not working. I'm getting the following exception:

[2015-10-16 16:39:51.233] boot - 3216  INFO [main] --- AnnotationConfigApplicationContext: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@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;
  }
}

Can anyone help me ?

7
  • 1
    Can you post your Spring configuration (XML or Java) ? Looks like your TestBean class is not known from Spring : No qualifying bean of type [com.bean.TestBean] found. And what are the packages of your classes ? Commented Oct 16, 2015 at 11:52
  • I couldn't reproduce this in my setup, have you configured boot in xml as well ? Commented Oct 16, 2015 at 11:55
  • I'm not using any xml configuration files. I'm using only spring boot and maven Commented Oct 16, 2015 at 12:23
  • So you don't have any Spring configuration file? Commented Oct 16, 2015 at 12:39
  • Yes I don't have any configuration files. Commented Oct 16, 2015 at 12:41

2 Answers 2

2

The default @SpringBootApplication enables component scan only for the package of the application class and all subpackages. Since the package of TestApp is com.test, and the package of TestBean is com.bean, component scan won't detect the bean class.

Solution:
If you are using Spring Boot 1.2.x:

Either add the following annotation to your TestApp class:

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

or move the TestBean to a subpackage of com.test, e.g. com.test.bean

If you are already using Spring Boot 1.3.x:

Add the following parameter to your @SpringBootApplication annotation:

@SpringBootApplication(scanBasePackages = {"com.test", "com.bean"})    
Sign up to request clarification or add additional context in comments.

1 Comment

I moved the class TestBean to package com.test and it worked !!
0

It seems that Spring is not aware of your TestBean so @Autowired cannot find it in the bean registry.

In order to make the @Autowired work add @ComponentScan after @EnableAutoConfiguration annotation.

If you defined TestBean in your-app-context.xml try adding this

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

after @EnableAutoConfiguration annotation. So, for example, if your-app-context.xml was in the META-INF/spring folder located into src/main/resources of your Eclipse project, the correct line would be:

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

It will expose all the beans declared in that context to Spring Boot.

3 Comments

I'm not using any xml configuration files. I'm using spring boot.
Updated answer: try adding @ComponentScan
dunni You're right, I missed the annotation. Also @EnableAutoConfiguration is redundant then...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.