首页 > 解决方案 > 没有符合条件的 Bean […] IsAvailable

问题描述

我有以下结构:

网络服务

@Autowired
public FooService(@Qualifier("fooMapper1") FooBO fooBO1,
        @Qualifier("fooMapper2") FooBO fooBO2,
        @Qualifier("fooMapper3") FooBO fooBO3) {
    this.fooBO1= fooBO1;
    this.fooBO2= fooBO2;
    this.fooBO3= fooBO3;
}

配置

@Configuration
public class MapperConfig {

    @Bean("fooMapper1")
    public FooBO oneMapper(FooOneMapper mapper) {
        return new FooBO(mapper);
    }
    @Bean("fooMapper2")
    public FooBO twoMapper(FooTwoMapper mapper) {
        return new FooBO(mapper);
    }
    @Bean("fooMapper3")
    public FooBO threeMapper(FooThreeMapper mapper) {
        return new FooBO(mapper);
    }
}

福宝

    @Autowired
    public FooBO(IFooMapper mapper) {
        this.mapper = mapper;
    }

IFooMapper是由FooOneMapperFooTwoMapperFooThreeMapper扩展的接口。

当我尝试运行该项目时,会抛出以下消息:

Description:

Parameter 0 of constructor in ...FooBO required a single bean, but 4 were found:
    - FooOneMapper: defined in file [C:...\mapper\FooOneMapper.class]
    - FooTwoMapper: defined in file [C:...\mapper\FooTwoMapper.class]
    - FooThreeMapper: defined in file [C:...\mapper\FooThreeMapper.class]
    - IFooMapper: defined in file [C:...\mapper\IFooMapper.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

我不明白为什么 spring 与 bean 有这种冲突,因为一切似乎都配置得很好。

标签: javaspring

解决方案


我猜你已经用注释FooBO进行了@Component注释。

扫描包含 Spring Boot 主类的根包以查找任何带有 @Component 注释的类,并将这些类注册为容器内的 Spring bean 定义

您正在配置类中创建 bean。确保FooBOIFooMapper没有使用@Component或其原型注释进行注释。

class FooBO {

    private final IFooMapper mapper;

    public FooBO(IFooMapper mapper) {
        this.mapper = mapper;
    }
}

如果由于某种原因您无法删除@Component. 其他修复方法是将其中一个实现标记IFooMapper为主要使用@Primary

@Component
@Primary
class FooOneMapper implements IFooMapper{

}

或提供额外的数据来帮助 spring 解决依赖关系。

public FooBO(@Qualifier("fooThreeMapper") IFooMapper mapper) {
    this.mapper = mapper;
}

推荐阅读