2013-07-05 11 views
11

Ich habe aus zwei Bohnen aus einer Java-Klasse erstellen mit Hilfe von XML-Konfiguration mit folgendem Code:Frühling schafft zwei Bohnen von einer Klasse mit Anmerkungen

<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> 

Mein Ziel ist es firstBean und secondBean auf Java-basierte Konfiguration wie diese bewegt : Aber

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; 
    } 
} 

wenn Kontext beginnt Federbeaufschlagung die folgende Ausnahme wirft:

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

Trotzdem funktioniert es in diesem Fall:

package some.package; 

    @Component 
    public class Filter{ 

     private Handler handler; 

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

    } 

Handler Umsetzung:

public class Handler { 

    private Service service; 

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

} 
+2

Können Sie Ihren vollständigen Kontext zeigen? Mit welcher Bohne auch immer 'firstBean'. –

+0

Wo wird genau diese Ausnahme ausgelöst? Wird das durch ein Autowiren mit dem Bean-Namen als Qualifier verursacht? Wenn ja, können Sie etwas mehr von Ihrer Kontextkonfiguration und/oder den relevanten Injektionskommentaren bereitstellen? –

+0

Was ist "Service"? –

Antwort

1

@Autowired ist immer nach Typ. Aber Sie haben zwei Handler in Ihrer Konfiguration. Wenn Sie versuchen, die Handler-Klasse automatisch zu starten, müssen Sie das Qualifikationsmerkmal angeben. Durch diese Feder kann aufgelöst werden, welche Instanz injiziert werden soll. Sonst wirft die Feder den Fehler NoSuchBeanDefinitionFoundError. Erwartete man zwei.

Hoffe, dass hilft.

+0

Dies kann nicht korrekt sein. Der Fehler besagt eindeutig, dass versucht wird, Bean nach Namen zu suchen. OP verwendet '@ Qualifier'. –

+0

Danke an alle für die Antwort. Eigentlich war mein Problem in web.xml. Ich habe zwei verschiedene Kontext und genau das ist nicht aktiviert :) – fashuser

-1

Vom Spring Docs, Abschnitt 5.9.3:

Wenn Sie Annotations gesteuerte Injektion von Namen zum Ausdruck bringen mögen, nicht in erster Linie @Autowired verwenden, auch wenn durch technisch in der Lage ist zu einem Bean Namen des Verweises @Qualifier-Werte Verwenden Sie stattdessen die JSR-250 @Resource-Annotation, die semantisch definiert ist, um eine bestimmte Zielkomponente anhand ihres eindeutigen Namens zu identifizieren, wobei der deklarierte Typ für den Matching-Prozess irrelevant ist.

Es ist ein Beispiel dafür in Abschnitt 5.9.5, aber für den Code, Ihre Filter Klasse soll wie folgt aussehen:

package some.package; 

@Component 
public class Filter { 

    private Handler handler; 

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

} 
+0

Auch wenn dies ein schönes Dokumentationsangebot ist, kann es das Problem nicht lösen.Der Fehler besagt eindeutig, dass versucht wird, Bean nach Namen zu suchen. OP verwendet '@ Qualifier'. –

+0

-1 Dies könnte eine nützliche Antwort für eine Frage in Bezug auf Best Practices oder etwas Ähnliches sein; Für diese spezielle Frage ist Ihre Aussage nutzlos. Außerdem wird diese Aussage höchstwahrscheinlich außerhalb des Kontexts zitiert. –

Verwandte Themen