@Autowired (required = false) für den Konstruktor mit NoSuchBeanDefinitionException

8

In einer Spring-Anwendung habe ich @Autowired(required=false) für Konstruktor verwendet. Dies bedeutet, dass, wenn die Bean, die autowiriert werden soll, in der XML-Datei nicht verfügbar ist, keine NoSuchBeanDefinitionException geworfen werden sollte, da ( required=false ) erwähnt wird. Aber ich bekomme die UnsatisfiedDependencyException , NoSuchBeanDefinitionException Ausnahme.

---- TextEditor

%Vor%

---- Rechtschreibprüfung

%Vor%

---- Beans.xml

%Vor%

--- Konsole (tatsächliches Ergebnis)

%Vor%

--- Erwartetes Ergebnis Das Programm sollte ohne Exception laufen, da @Autowire(required=false) für den Konstruktor erwähnt wird. Selbst wenn die Bean nicht gefunden wird, sollte die Ausnahme nicht kommen, da ( required=false ) erwähnt wird.

    
user1501192 24.04.2014, 11:20
quelle

2 Antworten

8

Diese Ausnahme tritt auf, weil required = false nicht bedeutet, dass sie null injiziert. Wenn es auf Konstruktoren angewendet wird, versucht Spring zu entscheiden, welcher Konstruktor am besten zum Erstellen der Instanz geeignet ist. In diesem Fall haben Sie nur einen Konstruktor, der einen SpellChecker, aber kein Objekt dieses Typs benötigt.

Wie im Spring-Dokument ( Ссылка ):

  

Nur ein Konstruktor (maximal) einer gegebenen Bean-Klasse darf diese Annotation tragen, die angibt, dass der Konstruktor bei Verwendung als Spring-Bean autowire ist. Ein solcher Konstruktor muss nicht öffentlich sein.

Wie auch immer, Sie können einen Standardkonstruktor hinzufügen (er kann privat sein), damit Spring, wenn er seine @Autowired-Magie nicht ausführen kann, diesen verwenden wird. In Ihrer TextEditor-Klasse könnten Sie hinzufügen:

%Vor%

Beachten Sie, dass @Deprecated verwendet wird, um zu vermeiden, dass Ihr Compiler Sie warnt, dass Sie einen privaten Konstruktor haben, den niemand verwendet.

    
Nicola 19.08.2014 16:47
quelle
3

Ich hatte ein ähnliches Problem. Tatsächlich können Sie mehrere Konstruktoren mit

haben %Vor%

Achten Sie jedoch darauf, dass Sie diese Annotation nicht zum Standardkonstruktor (ohne Argumente) hinzufügen können, da für die Anmerkung @Autowired mindestens ein Argument erforderlich ist

    
Geniy 30.12.2015 11:50
quelle

Tags und Links