Два компонента Spring Service Bean с одинаковым именем класса (разные пакеты) выдают ошибку даже с квалификатором

У меня есть следующие ...

package package1;

@Service
@Qualifier("kb")
public class UserService {
...
}

package package2;

@Service
@Qualifier("user")
public class UserService {
...
}

@Autowired
@Qualifier("user")
package2.UserService p2;
@Autowired
@Qualifier("kb")
package1.UserService p1;

Но когда я пытаюсь запустить это, я получаю ...

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [boot.Application]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'userService' for bean class [package1.UserService] conflicts with existing, non-compatible bean definition of same name and class [package2.UserService]

Как мне получить 2 службы с одинаковым именем?

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

Ответы 2

Удалите @Qualifier из класса, используйте @Qualifier только при автоматическом подключении

@Service("kb")
public class UserService {
...
}

package package2;

@Service("user")
public class UserService {
...
}

Из @Qualifier javadoc

**
 * This annotation may be used on a field or parameter as a qualifier for
 * candidate beans when autowiring. It may also be used to annotate other
 * custom annotations that can then in turn be used as qualifiers.
 */

Извините, мне пришлось забрать чек, я думал, что он работает, но теперь он говорит ... Consider defining a bean of type 'package1.UserService' in your configuration.

JGleason 01.05.2018 21:53

Здесь вам нужно понять цель @Qualifier.

There may be a situation when you create more than one bean of the same type and want to wire only one of them with a property. In such cases, you can use the @Qualifier annotation along with @Autowired to remove the confusion by specifying which exact bean will be wired.

Вы пытаетесь создать 2 класса с одинаковым именем, но в разных пакетах. Для этого вам нужно будет указать имя службы в качестве параметра значения для аннотации @Service, чтобы различать два:

package package1;

@Service("kb")
public class UserService {
...
}

package package2;

@Service("user")
public class UserService {
...
}

@Autowired
@Qualifier("user")
package2.UserService p2;
@Autowired
@Qualifier("kb")
package1.UserService p1;

Работаю у меня с аналогичной тестовой установкой. Какую ошибку вы получаете?

Simrandeep Singh 01.05.2018 22:23

Он говорит, что не может найти другую службу. Позвольте мне попробовать более простой проект.

JGleason 01.05.2018 22:29

Вроде простой проект работает, но все же не мой :-(

JGleason 01.05.2018 22:57

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

Simrandeep Singh 02.05.2018 07:40

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