Spring Boot - Bean创建异常

时间:2015-10-16 11:44:04

标签: java maven spring-boot

我正在使用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;
  }
}

任何人都可以帮助我吗?

2 个答案:

答案 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。