Разрешение конфликта Spring с @Autowired и @Qualifier - PullRequest
11 голосов
/ 21 октября 2011

У меня есть интерфейс

public interface ParentService{}

И два класса реализации

@Service("child1service")    
public class Child1 implements ParentService{}

@Service("child2service")
public class Child2 implements ParentService{}

Теперь мой контроллер

public class ServeChild1Controller extendds AbstractController{

 @Autowired
 public ServeChild1Controller(@Qualifier("child1service") ParentService child1service){
 super(child1service)
  } 

Аналогично есть ServeChild2Controller ..

Поэтому, когда я запускаю, я получаю следующую ошибку

Ошибка для ServeChild1Controller: не определен уникальный bean-компонент типа [com.service.ParentService]: ожидается один соответствующий бин, но найдено 2 child1service, child2service

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

Ответы [ 3 ]

22 голосов
/ 21 октября 2011

Чтобы использовать конкретный экземпляр, необходимо предоставить службе Annotate службу с помощью @Qualifier (id), а в конструкторе снова аннотировать параметр с помощью @Qualifier следующим образом:

@Service("child1service")
@Qualifier("child1service")
public class Child1 implements ParentService{}

@Service("child2service")
@Qualifier("child2service")
public class Child2 implements ParentService{}

А ты конструктор:

public class ServeChild1Controller extendds AbstractController{

    @Autowired
    public ServeChild1Controller(@Qualifier("child1service") ParentService child1service){
        super(child1service)
    }

}
0 голосов
/ 23 октября 2017

С Spring (Beans) 4.3 он работает точно так, как вы написали в своем вопросе.

Я могу привести вам пример с реализацией, с которой я столкнулся недавно.Spring может автоматически подключаться в зависимости от типа и спецификатора.Использование имен служб недостаточно, поскольку они должны быть уникальными, чтобы вы могли столкнуться с конфликтом типов.

Пример:

public interface ServiceA {}
public interface ServiceB {}

@Qualifier("mockedA")    
@Service
public class MockedA implements ServiceA {}

@Qualifier("realA")
@Service
public class RealA implements ServiceA {}

@Qualifier("mockedB")    
@Service
public class MockedB implements ServiceB {}

@Qualifier("realB")
@Service
public class RealB implements ServiceB {}

@Autowired
public ABController (
    @Qualifier("mockedA") ServiceA mockedA,
    @Qualifier("realA") ServiceA realA,
    @Qualifier("mockedB") ServiceB mockedB,
    @Qualifier("realB") ServiceB realB) {
} 
0 голосов
/ 21 октября 2011

Я думаю, что аннотация @Qualifier может потребоваться на том же уровне, что и аннотация @Autowired.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...