春季:麻烦的自动装配服务实现了基本接口

时间:2019-04-10 14:23:38

标签: java spring spring-data-jpa

我对spring实例化和自动装配服务的方式感到困惑。

基本上,我正在寻找以下问题的解决方案,该问题阻止了我的应用启动。

Field titleService1 in com.scorpio.spring.security.oauth2.controller.TitleController required a single bean, but 2 were found:
    - genderServiceImpl: defined in file [\spring\authorities\target\classes\com\spring\security\service\GenderServiceImpl.class]
    - titleServiceImpl: defined in file [\spring\authorities\target\classes\com\spring\security\service\TitleServiceImpl.class]

我有两个Rest控制器,分别是TitleControllerCompanyController,每个控制器都引用一个或多个服务。服务是BaseService<T>

的实现

TitleController.java

@RestController
@RequestMapping("/secured/title")
public class TitleController {

    @Autowired
    private BaseService<Title> titleService;

}

CompanyController.java

@RestController
@RequestMapping("/secured/company")
public class CompanyController {

    @Autowired
    private BaseService<Title> titleService;

    @Autowired
    private BaseService<Gender> genderService;
}

BaseService.java

public interface BaseService<T> {

    T get(Integer id);

    T get(String t);

    List<T> getAll();

    void create(T t);

    T update(T t);

    void delete(Integer id);

    void delete(T t);
}

看着错误required a single bean, but 2 were found并且由于BaseService有两种不同的实现,我确实理解Spring无法决定将哪个Autowire Bean进行注释,因为没有注释任何实现@Qualifer@Primary等。

但是更令人困惑的是,当我从titleService中注释掉TitleController并重新运行我的应用程序时,它就可以了。我的问题是spring如何在CompanyController中自动连线适当的服务?为什么我尝试在TitleController中自动连线,这行不通?

非常感谢。

1 个答案:

答案 0 :(得分:-2)

与自动连线一起使用限定符注释。限定符用于指定要使用的接口实现。

@Autowired
@Qualifier("Audi")
private Car car;