Не определено ни одного уникального компонента типа [бла]: ожидаемый единственный соответствующий компонент, но найден 2 [moreBlah]

1

Я пробовал все, что мог придумать, чтобы исправить эту ошибку, но весна не может отличить базовую holdService и ее дочернюю активациюHoldService.

@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;

Я пытаюсь Autowire HoldService, но я продолжаю получать сообщение об ошибке

не удалось открыть поле autwire: private com.erac.vos.service.vehicle.hold.HoldService com.erac.vos.webservice.vehicle.hold.HoldWebServiceValidator.holdService; Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: не определен уникальный bean-тип типа [com.erac.vos.service.vehicle.hold.HoldService]: ожидаемый единичный компонент соответствия, но найден 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;

Любые идеи, что происходит?

Теги:
spring
autowired

2 ответа

1

Существует первичная аннотация весны, которая может помочь вам решить проблему "легко", но я не думаю, что это то, что вы ищете.

Аннотации Квалификатора должны выполнять эту работу, насколько я могу судить, поэтому вам нужно копать глубже.

Существует метод в DefaultListableBeanFactory, называемый definePrimaryCandidate, который отвечает за устранение дубликатов, если это возможно, и в этом случае возникает исключение.

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)

Я бы отлаживал внутри этого метода и проверял, почему ваш Qualifier не был правильно разрешен. Это может быть простая опечатка, поэтому совпадение не выполняется в соответствии с вашим ожиданием или что-то менее тривиальное, но это должно быть подходящее место для копания.

  • 0
    +1 для @Primary предложения, потому что в моем случае это именно то, что я искал. Для контекста у меня есть класс зависимости, внедренный в библиотеку, и подкласс в приложении. Мне нужна аннотация @Component на обоих, и у меня возникли проблемы при создании уникального экземпляра.
0

В конце концов, я выяснил, удалил ли я декларацию пакета из аннотации и опустил первую букву, с которой она работала. Я до сих пор не понимаю, почему это работает, и он не делал этого раньше, но теперь он работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню