如何解决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 JPA 中的外键约束失败错误?
如何解决 Spring-cloud-sleuth-zipkin (Edgware.SR5) 中的 RabbitMQ 服务器连接错误