没有定义类型的唯一bean [blah]:预期的单个匹配bean但找到2 [moreBlah]

时间:2014-03-17 21:50:47

标签: java spring autowired

我已经尝试了一切我能想到的解决这个错误的方法,但是春天似乎无法区分基础holdService和它的孩子activationHoldService。

@Component("ActivationHoldService")
public class ActivationHoldServiceImpl extends HoldServiceImpl {

@Component("BaseHoldService")
public class HoldServiceImpl implements HoldService {

@Component("com.erac.vos.webservice.hold.HoldWebServiceValidator")
public class HoldWebServiceValidator extends BaseValidator {
  private static final Log LOG = LogFactory.getLog(
      com.erac.vos.webservice.hold.HoldWebServiceValidator.class);
  @Autowired
  @Qualifier("BaseHoldService")
  private HoldService holdService;

我试图自动挂起HoldService,但我不断收到错误消息

  

无法自动装配字段:私有   com.erac.vos.service.vehicle.hold.HoldService   com.erac.vos.webservice.vehicle.hold.HoldWebServiceValidator.holdService;   嵌套异常是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   [com.erac.vos.service.vehicle.hold.HoldService]类型的唯一bean是   已定义:预期单个匹配bean但找到2:   [ActivationHoldService,BaseHoldService]

我已尝试将其更改为

@Resource(name="BaseHoldService",type=com.erac.vos.service.vehicle.hold.HoldServiceImpl.class)

包括排除quailifier,甚至将baseHoldService切换为另一个名称,以及我能想到的那些东西的任意组合,以使其工作,但它仍然无法找到它。最奇怪的部分是在不同的类中具有几乎完全相同的代码行

@Resource(name="BaseHoldService",type=com.erac.vos.service.vehicle.hold.HoldServiceImpl.class)
  private HoldService defaultHoldService;

任何想法都在发生?

2 个答案:

答案 0 :(得分:2)

有弹簧的主要注释可以帮助你“轻松”解决问题,但我不认为这是你正在寻找的。

限定符注释应该尽我所能,所以你必须深入挖掘。

DefaultListableBeanFactory中有一个名为determinePrimaryCandidate的方法,它负责在可能的情况下解析重复项,这是抛出异常的地方。

http://docs.spring.io/spring/docs/3.2.5.RELEASE/javadoc-api/org/springframework/beans/factory/support/DefaultListableBeanFactory.html#determinePrimaryCandidate(java.util.Map,%20org.springframework.beans.factory.config.DependencyDescriptor)

我会调试此方法并检查为什么您的限定符未正确解析。这可能是一个简单的拼写错误,所以匹配不是根据你的期望完成的,或者它不是那么简单,但这应该是正确的挖掘地点。

答案 1 :(得分:0)

我最终想出是否从注释中删除了包声明并降低了它工作的第一个字母。我仍然不明白为什么这个工作,它之前没有,但它现在有效