Проблема с Autowiring & No unique bean
У меня есть 2 класса (B, C), которые расширяют класс A.
@Service
public class A extends AbstratClass<Modele>{
@Autowired
A(MyClass br) {
super(br);
}
@Service
public class B extends A{
@Autowired
B (MyClass br) {
super(br);
}
@Service
public class C extends A{
@Autowired
C (MyClass br) {
super(br);
}
Но у меня есть это сообщение:
Не определено уникальное bean типа [A]]: ожидаемое однократное совпадение bean, но найдено 2: [A, B, moveModeleMarshaller]
Я действительно не могу понять, почему у меня есть это сообщение и как решить проблему даже после чтения документации Spring.
Спасибо заранее.
Ответы
Ответ 1
Вы должны переписать свой класс на что-то вроде этого с помощью аннотации @Qualifier
.
@Service
@Qualifier("a")
public class A extends AbstratClass<Modele>{
@Autowired
A(MyClass br) {
super(br);
}
@Service
@Qualifier("b")
public class B extends A{
@Autowired
B (MyClass br) {
super(br);
}
@Service
@Qualifier("c")
public class C extends A{
@Autowired
C (MyClass br) {
super(br);
}
Вы также должны использовать аннотацию @Qualifier для экземпляра типа A, который вы создаете Spring bean в.
Что-то вроде этого:
public class Demo {
@Autowired
@Qualifier("a")
private A a;
@Autowired
@Qualifier("b")
private A a2;
public void demo(..) {..}
}
Если вам не нравится иметь эту конфигурацию Spring в вашем производственном коде, вы должны написать логику инъекции зависимостей с конфигурацией XML или Java.
Вы также можете указать по умолчанию bean типа A с аннотацией @Primary
над одним из ваших служебных классов, который расширяет тип A. Тогда Spring может автоушиваться без указания аннотации @Qualifier
.
Так как Spring никогда не попытается угадать, какой bean для ввода, вы должны указать, какой из них или отметить один из них с помощью @Primary
, если его более одного bean для типа.
Ответ 2
Вы пытаетесь (где-то еще) использовать autwire bean типа A
. Что-то вроде:
@Autowired
private A beanA;
Но у вас есть 2 beans, которые соответствуют этому.
Вы можете решить эту проблему, используя @Resource
и указав, какой именно bean:
@Resource("b")
private A beanA;
(где "b" - это имя введенного bean) или с помощью аннотации @Qualifier
.
Ответ 3
Обычно вы получите эту ошибку, если определены два beans с тем же классом
<bean id="a" class="com.package.MyClass"/>
<bean id="b" class="com.package.MyClass"/>
если вы обратились к вышеуказанной строке, у нас есть два beans с тем же классом.
когда вы пытаетесь autwire этот класс в любом другом классе, вы получите этот тип ошибки
У вас есть два решения
Первый метод
-
используйте квалификатор, определив инициализацию id bean
как это
@Autowired
@Qualifier("a")
MyClass a;
@Autowired
@Qualifier("b")
MyClass b;
Второй метод
используйте JSR250 api (его файл jar, который вы можете поместить в свой путь к классу
Затем выполните автоподключение, как показано ниже
@Resource("a")
MyClass a
@Resource("b")
MyClass a