通过字段'fooService'表示的不满意的依赖性:找不到依赖项[aaa.FooService]

时间:2016-12-08 18:22:38

标签: java spring spring-mvc spring-boot dependency-injection

我在Spring boot 1.4.0中遇到过Spring这种奇怪的行为。 Spring基本上告诉我它不能将bean自动装入资源,因为它没有发现自己的依赖。

UnsatisfiedDependencyException: Error creating bean with name 'restResource': Unsatisfied dependency expressed through field 
'fooService': No qualifying bean of type [**aaa.FooService**] found for dependency [**aaa.FooService**]

FooService在资源中自动装配。当我@Autowire进入创建资源的@Configuration文件时,会按预期注入它。

这有效:

public class ServiceMocksRestConfig extends WebMvcConfigurerAdapter {
@Autowired
private FooService fooService; //instance here

@Bean
public FooResource fooResource() {
    return new FooResource(); // debuger stop here
}

//调试步骤进入

@RestController
public class FooResource {
    @Autowired
    private FooService fooService; //bang

有人有任何想法,可能出了什么问题?

有趣的是,当我使用启动弹簧运行器从测试运行应用程序时,它也可以工作(一切,包括此资源)

2 个答案:

答案 0 :(得分:0)

我今天成功找到了根本原因。它的Spring Boot devtools - 更确切地说是它的拆分类加载器(相关bug:https://github.com/spring-projects/spring-boot/issues/3316

当子REST @Configuration即将@Autowire FooService

时,我在ListableBeanFactory中放置一个断点

并且做了FooService instanceof FooServiceInterface,它返回false。 当我做FooService.class.getClassLoader()和beanfactory.getBean(" fooService" / 不能在这里使用类,会触发未找到异常 /)。getClass()。getClassloader ()这些是不同的(一个是AppClassLoader,另一个是devtools可重启的类加载器)。

解决方案:从类路径中删除boot devtools。

答案 1 :(得分:0)

确切原因是,在运行时尝试将$data_string = array( "ProductDc"=>array( "product_name" => "Electronics", "price" => "200 usd" ), "buyerDC"=>array( "buyer_name" => "john mark", "address" => "17 more strret" ) ); 自动装入FooService时,Spring IOC容器内的类型FooService没有初始化bean。

它可能是由于发展中的不同错误造成的。这个article解决了可能导致此问题的每一个可能的错误。