2013-07-05 13 views
11

mam może stworzyć z dwóch ziaren z jednej klasy Java z wykorzystaniem konfiguracji XML przy użyciu następującego kodu:Wiosna tworzy dwa ziarna z jednej klasy z wykorzystaniem adnotacji

<context:component-scan base-package="some.package"/> 

    <bean id="dependentBean" class="some.package.DependentBean"> 
     <property name="firstBean" ref="firstBean"/> 
    </bean> 

    <bean id="firstBean" class="some.package.Handler"> 
     <constructor-arg index="0" ref="service"></constructor-arg> 
     <property name="defaultUrl" value="url/first"></property> 
    </bean> 

    <bean id="secondBean" class="some.package.Handler"> 
     <constructor-arg index="0" ref="service"></constructor-arg> 
     <property name="defaultUrl" value="url/second"></property> 
    </bean> 

moim celem jest poruszać firstBean i secondBean konfiguracji Javie jak ta :

package some.package; 

@Configuration 
public class Configuration { 

    @Bean(name="firstBean") 
    public Handler firstHandler(Service service){ 
     Handler handler= new Handler(service); 
     handler.setDefaultTargetUrl("url/first"); 
     return handler; 
    } 


    @Bean(name="secondBean") 
    public Handler secondHandler(Service service){ 
     Handler handler = new Handler(service); 
     handler.setDefaultTargetUrl("url/second"); 
     return handler; 
    } 
} 

Ale gdy kontekst rozpoczyna ładowanie wiosna rzuca następujący wyjątek:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'firstBean' is defined 

Mimo to działa w tym przypadku:

package some.package; 

    @Component 
    public class Filter{ 

     private Handler handler; 

     @Autowired 
     public Filter(@Qualifier("secondBean") Handler handler) { 
      this.handler = handler; 
     } 

    } 

realizacja Handler:

public class Handler { 

    private Service service; 

    @Autowired 
    public Handler(Service service) { 
     this.service = service; 
    } 

} 
+2

można pokazać swój pełny kontekst? W zależności od tego, który komponent bean zależy od 'firstBean'. –

+0

Gdzie dokładnie jest zgłaszany wyjątek? Czy jest to spowodowane przez niektóre autowiring z nazwą komponentu bean jako kwalifikatorem? Jeśli tak, to czy możesz podać nieco więcej konfiguracji kontekstowej i/lub odpowiednich adnotacji wstrzykiwania? –

+0

czym jest "usługa"? –

Odpowiedz

1

@Autowired jest zawsze według typu. Ale w twojej konfiguracji masz dwa Handlery. Dlatego przy próbie wypromowania klasy obsługi należy określić kwalifikator. Do tej wiosny może rozstrzygnąć, który przypadek wstrzyknąć. Inaczej, wiosna wyrzuca błąd pokazujący NoSuchBeanDefinitionFoundError. Oczekiwano, że jeden znajdzie dwa.

Nadzieję, że pomaga.

+0

To nie może być poprawne. Błąd wyraźnie stwierdza, że ​​próbuje wyszukać fasolę po nazwie. OP używa '@ Qualifier'. –

+0

Dziękuję wszystkim za odpowiedź. W rzeczywistości mój problem był w web.xml. Mam dwa różne konteksty i dokładnie to nie włącza :) – fashuser

-1

Z Spring Docs, sekcja 5.9.3:

Jeśli zamierzają wyrazić adnotacji napędzane iniekcji według nazwy, nie należy przede wszystkim wykorzystać @Autowired, nawet jeśli jest to technicznie zdolny nawiązując do nazwy przez fasoli Wartości @Qualifier. Zamiast tego użyj adnotacji JSR-250 @Resource, która jest semantycznie zdefiniowana, aby zidentyfikować określony składnik docelowy za pomocą jego unikalnej nazwy, przy czym zadeklarowany typ jest nieistotny dla procesu dopasowywania.

Jest przykładem tego w sekcji 5.9.5, ale na kodzie, Twój Filtr klasa powinna wyglądać następująco:

package some.package; 

@Component 
public class Filter { 

    private Handler handler; 

    @Resource(name="secondBean") 
    public Filter(Handler handler) { 
     this.handler = handler; 
    } 

} 
+0

Nawet jeśli masz fajną dokumentację, to nie rozwiąże problemu.Błąd wyraźnie stwierdza, że ​​próbuje wyszukać fasolę po nazwie. OP używa '@ Qualifier'. –

+0

-1 Może to być przydatna odpowiedź na pytanie dotyczące najlepszych praktyk lub czegoś podobnego; dla tego konkretnego pytania twoje oświadczenie jest bezużyteczne. Poza tym to stwierdzenie jest najprawdopodobniej cytowane poza kontekstem. –

Powiązane problemy