Я создаю образец приложения, используя Spring boot и maven. Автоматическое подключение с использованием @Autowire не работает. У меня следующее исключение:

[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;
  }
}

Может кто-нибудь мне помочь ?

1
Krishnanunni P V 16 Окт 2015 в 14:44

2 ответа

Лучший ответ

По умолчанию @SpringBootApplication включает сканирование компонентов только для пакета класса приложения и всех подпакетов. Поскольку пакет TestApp - com.test, а пакет TestBean - com.bean, сканирование компонентов не обнаружит класс bean-компонента.

Решение:
Если вы используете Spring Boot 1.2.x:

Либо добавьте следующую аннотацию в свой класс TestApp:

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

Или переместите TestBean в подпакет com.test, например com.test.bean

Если вы уже используете Spring Boot 1.3.x:

Добавьте следующий параметр в аннотацию @SpringBootApplication:

@SpringBootApplication(scanBasePackages = {"com.test", "com.bean"})    
2
dunni 16 Окт 2015 в 14:15

Похоже, Spring не знает о вашем TestBean, поэтому @Autowired не может найти его в реестре bean-компонентов.

Чтобы заставить @Autowired работать, добавьте @ComponentScan после аннотации @EnableAutoConfiguration.

Если вы определили TestBean в your-app-context.xml, попробуйте добавить это

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

После аннотации @EnableAutoConfiguration. Так, например, если your-app-context.xml находится в папке META-INF / spring, расположенной в src / main / resources вашего проекта Eclipse, правильной строкой будет:

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

Он предоставит все компоненты, объявленные в этом контексте, для Spring Boot.

0
abarisone 16 Окт 2015 в 12:53