2014-12-15 11 views
8

Ho classe Circle: classePrimavera ignorando @Qualifier in programma molto semplice

public class Circle 
{ 
    @Autowired 
    @Qualifier("pointA") 
    private Point center; 

    public Point getCenter() 
    { 
     return center; 
    } 
    public void setCenter(Point center) 
    { 
     this.center = center; 
    } 
} 

punto:

public class Point 
{ 
    private int x; 
    private int y; 

    public int getX() 
    { 
     return x; 
    } 
    public void setX(int x) 
    { 
     this.x = x; 
    } 
    public int getY() 
    { 
     return y; 
    } 
    public void setY(int y) 
    { 
     this.y = y; 
    } 
} 

E la mia primavera 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" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd" 
     > 

     <bean id="pointA" name="pointA" class="SpringTest.Point"> 
      <qualifier value="pointA"/> 
      <property name="x" value="4"/> 
      <property name="y" value="4"/> 
     </bean> 

     <bean id="pointB" name="pointB" class="SpringTest.Point"> 
       <property name="x" value="2"/> 
       <property name="y" value="5"/> 
     </bean> 

     <bean id="circle" class="SpringTest.Circle"> 
     </bean> 

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

</beans> 

Per quanto mi preoccupato che questo dovrebbe funzionare in questo modo: 1. Spring vedere l'annotazione @Autowire 2. Spring realiz es che ci sono molti fagioli di tipo Point 3. Spring usa l'annotazione @Qualifier per determinare quale bean iniettare

Purtroppo non funziona così. Durante l'esecuzione di:

AbstractApplicationContext abstractApplicationContext = new ClassPathXmlApplicationContext("spring.xml"); 
BeanFactory beanFactory = abstractApplicationContext.getBeanFactory(); 

sto ottenendo un errore:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'circle': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private SpringTest.Point SpringTest.Circle.center; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [SpringTest.Point] is defined: expected single matching bean but found 2: pointA,pointB 

Sono principiante in tema di primavera ma credo @Qualifier annotazione dovrebbe fare il lavoro e determinare quali fagioli da utilizzare.

registro di avvio: https://gist.github.com/mmajews/384207ee97b2cc8bd49a

+1

Sì, dovrebbe funzionare correttamente (anche se l'utilizzo della configurazione basata su Java è molto più semplice dell'XML che si sta utilizzando). Per favore pubblica la versione di Spring che stai usando, così come i log di avvio a livello DEBUG. – chrylis

+0

@chrylis Spring version è 4.1.2.RELEASE. Come posso ottenere i log di avvio? –

+1

Come stai facendo funzionare l'applicazione? In generale, devi configurare il tuo logger (log4j o logback) per inviare messaggi da 'org.springframework' a DEBUG. – chrylis

risposta

7

È necessario aggiungere <context:annotation-config/> nel file xml primaverile, anziché creare un'istanza dello AutowiredAnnotationBeanPostProcessor, poiché questo non gestisce le annotazioni @Qualifier.

Oppure, se si vuole veramente controllare tutto ciò che viene istanziato nel proprio contesto, dare un'occhiata all'effettivo candidate resolver per @Qualifier.

-3

Dovete fare il vostro Point center pubblica:

public Point center;

Primavera ha accesso solo alle proprietà pubbliche un metodi.

+1

Spring e ogni altro contenitore CDI autowire i campi privati. – chrylis

Problemi correlati