2016-07-25 3 views
0

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

класс
public class Circle{ 
    private Point center; 

    @Autowired 
    @Qualifier("circleRelated") 
    public void setCenter(Point center) { 
     this.center = center; 
    } 

    public void draw() { 
     System.out.println("Drawing Circle"); 
     System.out.println("Centre point is " + center.getX()); 
    } 
} 

Точка выглядит следующим образом

public class Point { 
    private int x; 
    public int getX() { return x; } 

    public void setX(int x) { this.x = x;} 
} 

beans.xml является

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="circle" class="com.example.Circle"/> 

    <bean id="pointA" class="com.example.Point"> 
    <qualifier value="circleRelated" /> 
    <property name="x" value="0"/> 
    <property name="y" value="0"/> 
    </bean> 

    <bean id="pointB" class="com.example.Point"> 
    <property name="x" value="-20"/> 
    <property name="y" value="0"/> 
    </bean> 

    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 

</beans> 

Мой главный класс

import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

@SpringBootApplication 
public class AutowiredAnnotationApplication { 

    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

     Circle circle = (Circle) context.getBean("circle"); 
     circle.draw(); 
    } 
} 

Ошибка я получаю

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.example.Point] is defined: expected single matching bean but found 2: pointA,pointB 

Почему весна неспособна autowire фасоль с данным классификатором?

+0

Я не использовал с целью –

ответ

0

@Qualifier получает идентификатор bean-компонента как значение. Таким образом, вы должны использовать «или» точку А «pointB»

public class Circle{ 
    private Point center; 

    @Autowired 
    @Qualifier("pointA") 
    public void setCenter(Point center) { 
     this.center = center; 
    } 

    public void draw() { 
     System.out.println("Drawing Circle"); 
     System.out.println("Centre point is " + center.getX()); 
    } 
} 

В общем, если вы пропустите @Qualifier - вы autowire по типу. Это означает, что «поиск в контексте Spring является компонентом этого типа и генерирует исключение, если не найдено ни одного, ни одного».

Если добавить @Qualifier («SomeName»), что означает - «поиск в контексте Spring боб этого типа и с таким именем и выбросить исключение, если ничего не найдено»

Edit: Взгляните на this. Я не думаю, что вам нужен тег вообще.

Если вам не нужно вводить какой-либо компонент, используя @Autowired, тонуждается в идентификаторе bean-компонента как его значения. Например, для @Qualifier("pointA") потребуется компонент с идентификатором: pointA.

Если вы хотите вставить компонент, используя только xml, вы можете использовать ref. Для этого вам не нужен Qualifier, только для автоподдержки.

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="circle" class="com.example.Circle"> 
     <property name="center" ref="pointA"/> 
    </bean> 

    <bean id="pointA" class="com.example.Point"> 
    <qualifier value="circleRelated" /> 
    <property name="x" value="0"/> 
    <property name="y" value="0"/> 
    </bean> 

    <bean id="pointB" class="com.example.Point"> 
    <property name="x" value="-20"/> 
    <property name="y" value="0"/> 
    </bean> 

</beans> 

Edit 2: См this. Я считаю, что тег квалификатора учитывается только в том случае, если вы пропускаете идентификатор компонента, иначе используется идентификатор компонента.

+0

Спасибо. Что я могу изменить для работы с тегом '

+0

@PranavKapoor См. Мое редактирование. –

+0

Вы правы, что здесь мне не нужен тег квалификатора. Но тогда, какой прецедент он даже имеет? –

0

Вы должны удалить эту строку из вашего beans.xml:

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 

По какой-то причине, это вмешательство с иным правильной конфигурации.

Смежные вопросы