我正在使用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;
}
}
任何人都可以帮助我吗?
答案 0 :(得分: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"})
答案 1 :(得分:0)
看起来Spring并不知道你的TestBean
所以@Autowired
在bean注册表中找不到它。
为了使@Autowired
工作在@ComponentScan
注释后添加@EnableAutoConfiguration
。
如果您在TestBean
中定义your-app-context.xml
,请尝试添加此
@ImportResource(value={"your-app-context.xml"})
@EnableAutoConfiguration
注释后的。 因此,例如,如果your-app-context.xml位于Eclipse项目的src / main / resources中的META-INF / spring文件夹中,那么正确的行将是:
@ImportResource(value={"/META-INF/spring/your-app-context.xml"})
它会将在该上下文中声明的所有bean公开给Spring Boot。