如何解决Spring中的NoUniqueBeanDefinitionException错误预期单个匹配bean但在使用工厂模式时找到2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决Spring中的NoUniqueBeanDefinitionException错误预期单个匹配bean但在使用工厂模式时找到2相关的知识,希望对你有一定的参考价值。

我创建了一个工厂模式,它为我提供了我应该用于任务的服务。早些时候只有一项服务,一切运作良好。

但现在我又添加了一项服务,我收到了错误消息:

org.springframework.beans.factory.NoUniqueBeanDefinitionException

我已尝试使用@Qualifier@Resource注释来修复此问题,如此处的其他答案所示。但它没有帮助。

 public interface IService { 
     public PerformTask();
 }

 @Service
 public class ServiceA implements IService {
     public PerformTask(){};
 }

 @Service
 public class ServiceB implements IService {
     public PerformTask(){};
 } 

 public interface IServiceProviderFactory {
     IService getService(Task task){}
 }

 @Service
 public class ServiceProviderFactory implements IServiceProviderFactory {

    @Autowired
    private ServiceA serviceA;

    @Autowired
    private ServiceB serviceB;

    @Override
    public IService getService(){
        if(task=="A")
            return serviceA;
        else
            return serviceB;
    }
 }

 @RestController
 @RequestMapping("/myService/api/v1")
 public class myServiceController {

    @Autowired
    private IService iService;

    @Autowired
    private IServiceProviderFactory ServiceProviderFactory;

    @PostMapping("/task")
    public ResponseEntity performATask(@RequestBody Task task){
    this.iService=ServiceProviderFactory.getService(task);
    this.iService.PerformTask();
    return new ResponseEntity(HttpStatus.CREATED);
}
答案

异常告诉你,Spring不知道你的myServiceController.iService中注入了什么bean(你有2个实现这个接口的bean)。在你的情况下,我建议完全删除这个字段,因为你不需要它。此外,没有任何意义上自己分配@Autowired字段。

 @RestController
 @RequestMapping("/myService/api/v1")
 public class myServiceController {

    @Autowired
    private IServiceProviderFactory ServiceProviderFactory;

    @PostMapping("/task")
    public ResponseEntity performATask(@RequestBody Task task){
    ServiceProviderFactory.getService(task).PerformTask();
    return new ResponseEntity(HttpStatus.CREATED);
}
另一答案

你肯定可以指定一个bean并解决有@Qualifier的歧义(甚至指定具体实现的正确名称)。

但在你的例子中,@Autowire服务没有意义,然后重新分配它。

您可能会面临可能的并发问题。尽管您可能没有明确使用多线程,但大多数应用程序服务器都允许并发请求。所以在这里使用第二种方法试图从IService获取IServiceProviderFactory并将其分配给共享的private IService iService对象实例可能会导致不一致和错误的服务解析。

而且这是浪费资源。如果你马上把它扔掉,为什么要问Spring解决问题呢?

如果你需要在方法中操纵IService,这就是它的假设:

@RestController
@RequestMapping("/myService/api/v1")
public class myServiceController {

    @Autowired
    private IServiceProviderFactory ServiceProviderFactory;

    @PostMapping("/task")
    public ResponseEntity performATask(@RequestBody Task task) {
        final IService iService = ServiceProviderFactory.getService(task);
        iService.performTask();
        return new ResponseEntity(HttpStatus.CREATED);
    }
}

否则你可以摆脱第一个答案中提出的IService参考。

以上是关于如何解决Spring中的NoUniqueBeanDefinitionException错误预期单个匹配bean但在使用工厂模式时找到2的主要内容,如果未能解决你的问题,请参考以下文章

如何解决spring boot test中的空指针异常?

Spring是如何解决循环依赖的?

如何解决无法添加或更新子行:Spring JPA 中的外键约束失败错误?

如何解决 Spring-cloud-sleuth-zipkin (Edgware.SR5) 中的 RabbitMQ 服务器连接错误

如何解决 java spring boot 应用程序中的安全审计查找日志注入

0源码基础学习Spring源码系列——Spring如何解决循环依赖