Как установить квалификатор в реализации, имеющей интерфейс, который расширяет другой интерфейс

У меня есть 2 интерфейса A и B, которые расширяют другой интерфейс C. Однако, когда я использую @Qualifier("aImpl"), я получаю неудовлетворительную зависимость от spring

Интерфейсы

public interface EsResourceLoader { ... }

public interface CommonEsDao extends EsResourceLoader { ... }

public interface CommonModifiedEsDao extends EsResourceLoader { ... }

Первая реализация

@Service
public class LBModifiedEsDao implements CommonModifiedEsDao { ... }

Вторая реализация

@Service
public class LBDao implements CommonEsDao { 

  private CommonModifiedEsDao myDao;

  @Autowired
  public LBDao(@Qualifier("lBModifiedEsDao") CommonModifiedEsDao myDao) { ... 
  }
}

Контроллер выдает исключение

@RestController
@RequestMapping{...}
public class IndexAdminController {

  private CommonEsDao esDao;

  @Autowired
  public IndexAdminController(@Qualifier("lBDao")CommonEsDao esDao){ ... }


}

А вот Исключение

Exception encountered during context initialization - cancelling refresh 
attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'indexAdminController': Unsatisfied dependency 
expressed through field 'lbDao';

В вашем indexAdminController нет поля lbDao. Вы уверены, что код соответствует исключению? Может быть, ваш контроллер более старой версии?

Karol Dowbecki 18.01.2019 13:05

дело не в поле, я думаю, дело в разрешении имен, может быть, вы можете поставить @Service ("lbDao"), а затем попробовать еще раз

Mithat Konuk 18.01.2019 13:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
249
1

Ответы 1

Поместите свою аннотацию @Qualifier в службу, и она должна работать.

@Service
@Qualifier("lBModifiedEsDao") 
public class LBModifiedEsDao
implements CommonModifiedEsDao { ... }

А также для второго обслуживания

@Service
@Qualifier("lBDao")
public class LBDao implements CommonEsDao { 

  private CommonModifiedEsDao myDao;

  @Autowired
  public LBDao(@Qualifier("lBModifiedEsDao") CommonModifiedEsDao myDao) { ... 
  }
}

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

Обновлено: Как и в вашем коде с аннотацией @Qualifier, можно использовать имя в аннотациях компонентов, т.е.: @Component("myComponent")

Другие вопросы по теме