Я пробовал все, что мог придумать, чтобы исправить эту ошибку, но весна не может отличить базовую 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;
Любые идеи, что происходит?
Существует первичная аннотация весны, которая может помочь вам решить проблему "легко", но я не думаю, что это то, что вы ищете.
Аннотации Квалификатора должны выполнять эту работу, насколько я могу судить, поэтому вам нужно копать глубже.
Существует метод в DefaultListableBeanFactory, называемый definePrimaryCandidate, который отвечает за устранение дубликатов, если это возможно, и в этом случае возникает исключение.
Я бы отлаживал внутри этого метода и проверял, почему ваш Qualifier не был правильно разрешен. Это может быть простая опечатка, поэтому совпадение не выполняется в соответствии с вашим ожиданием или что-то менее тривиальное, но это должно быть подходящее место для копания.
В конце концов, я выяснил, удалил ли я декларацию пакета из аннотации и опустил первую букву, с которой она работала. Я до сих пор не понимаю, почему это работает, и он не делал этого раньше, но теперь он работает
@Primary
предложения, потому что в моем случае это именно то, что я искал. Для контекста у меня есть класс зависимости, внедренный в библиотеку, и подкласс в приложении. Мне нужна аннотация@Component
на обоих, и у меня возникли проблемы при создании уникального экземпляра.