Spring @Qualifier не работает, когда bean находится в другом jar-файле - PullRequest
0 голосов
/ 05 марта 2012

У меня есть несколько компонентов Spring, некоторые из которых находятся в общей библиотеке jar. Я не могу заставить @Qualifier работать.

У меня по умолчанию autowire установлено на "byType" , это использует Spring 3.1.0.M2 и работает как автономный исполняемый файл. Если я удалю «TestTwoBean» из общей библиотеки, проект будет выполнен как положено.

MYPROJ-разделяемой lib.jar:

@Service
public class TestOneBean implements ITestBean {
}

@Service
public class TestTwoBean implements ITestBean {
}

myproj.jar:

@Service
public class TestConsumerBean {

    @Autowired @Qualifier("testOneBean")
    private ITestBean bean;

}

Я получаю исключение "нет уникального компонента с именем" во время выполнения:

org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания компонента с именем 'testConsumerBean', определенным в файле [-]: Неудовлетворенная зависимость выражается через свойство bean-компонента:: No Определен уникальный бин типа [com.myco.ITestBean]: ожидается один соответствующий бин, но найден 2: [testOneBean, testTwoBean]; вложенными исключение org.springframework.beans.factory.NoSuchBeanDefinitionException: нет Определен уникальный бин типа [com.myco.TestBean]: ожидается один соответствующий бин, но найден 2: [testOneBean, testTwoBean] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType (AbstractAutowireCapableBeanFactory.java:1167) ...

Не работает @Qualifier в этой ситуации? Есть ли известный обходной путь?

1 Ответ

2 голосов
/ 05 марта 2012

Вы уверены, что хотите использовать autowire по типу AND и добавлению аннотаций?Автовыбор по типу означает, что Spring будет пытаться внедрить обнаруженные сеттеры и параметры конструктора, используя поиск по типу, даже если они не аннотированы для внедрения.

В то же время вы пытаетесь внедрить поля по имени.Ваши @Service аннотированные классы создают бины с именами по умолчанию, равными имени класса, «testOneBean» и «testTwoBean» соответственно.@Qualifier использует имена бинов в качестве правильных совпадений.Рекомендуемый способ сделать инъекцию «по имени», используя @Resource(name="testOneBean").Я могу только догадываться, что пружина пробует впрыск по типу из-за того, что режим автопроводки установлен по типу (что, я сомневаюсь, вам действительно нужно).

Я бы порекомендовал вернуться к режиму автоматической передачи по умолчанию и использовать @Resource для подключения по имени.

...