Исключение org.springframework.beans.factory.NoUniqueBeanDefinitionException: не определен квалифицирующий компонент типа: ожидается один соответствующий компонент

Я практикую весну 4; У меня есть Интерфейс (Персона) с 2 его классами-исполнителями (Профессор и Студент). конфигурация автоматическая с Java (AutomaticBeanConfiguration.java)

Когда я пытаюсь получить доступ к объекту Person: Person person = ctx.getBean(Person.class); person.showAge();

выдает следующую ошибку во время выполнения:

Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException:
    No qualifying bean of type [spring.automaticconfiguration.ambiguityautowiring.solution.qualifier.practice2.Person] is defined:
    expected single matching bean but found 2: student,professor

Я знаю, что @Primary и / или @Qualifier должны решить проблему, но так как это автоматическая конфигурация Java, я не смог найти правильное решение.

У кого-нибудь есть подсказка?

ниже я приложил полный стек ошибок и весь исходный код. Спасибо,

полная ошибка:

Mar 02, 2015 10:36:40 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@115c6cb: startup date [Mon Mar 02 10:36:40 EST 2015]; root of context hierarchy
Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [spring.automaticconfiguration.ambiguityautowiring.solution.qualifier.practice2.Person] is defined: expected single matching bean but found 2: student,professor
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:365)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)
    at spring.automaticconfiguration.ambiguityautowiring.solution.qualifier.practice2.AppMain.main(AppMain.java:44)

Исходный код:

public interface Person {
    public String showName();

    public Integer showAge();
}

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
@Qualifier("professor")
public class Professor implements Person {
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String showName() {
        return getName();
    }
    public Integer showAge() {
        return getAge();
    }

}

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
@Qualifier("student")
public class Student implements Person {
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String showName() {
        return getName();
    }
    public Integer showAge() {
        return getAge();
    }
}

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan //For Automatic Bean Discovery aby Spring Framework
public class AutomaticBeanConfiguration {
}

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppMain {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(
                AutomaticBeanConfiguration.class);

       //Doesn't work
       // expected single matching bean but found 2: student,professor

        Person person = ctx.getBean(Person.class);
        person.showAge();
    }
}

Ссылки: Spring in Action: охватывает Spring 4, 4-е издание Tutorial Point Spring 3

1 ответ

Решение

Это ожидаемое поведение. У Spring нет возможности узнать, какая конкретная реализация Person интерфейс, который вы хотите, так что он бросает это приятное исключение. Спросите о конкретной реализации, либо:

Person person = ctx.getBean(Student.class);

или же:

Person person = ctx.getBean(Professor.class);

Или вы могли бы также использовать getBeansOfType() метод для получения всех бинов, которые реализуют Person интерфейс:

Map<String, Person> persons = ctx.getBeansOfType(Person.class);

Ключом будет имя боба.

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