Autowird Map funktioniert nicht wie erwartet

8

Ich benutze Frühling 3.0.4. Ich habe einige Beans, die die @Autowired-Annotation in Maps verwenden. Diese Maps werden in einer Datei application-context.xml definiert (da diese Maps mit mehreren Factory-Methoden erstellt werden).

Wenn ich meinen Debugger verwende, kann ich sehen, dass die Map mit der richtigen (erwarteten) Bean-ID erstellt wird. Sobald der Autowiring-Prozess gestartet wird, wird jedoch behauptet, dass er keine Bean mit der ID finden kann, die gerade erstellt wurde.

Code-Teil:

%Vor%

Stück Kontext xml:

%Vor%

Wichtiges Detail, wenn ich den Typ in java.lang.Object sowohl in meiner Klasse als auch im Kontext-XML ändere, wird verdrahtet Tatsächlich kann ich es in meinem Code in eine HashMap umwandeln alles zur Arbeit bringen. Aber das ist nicht, was ich offensichtlich will.

Hat jemand eine Erklärung, was ich falsch mache?

    
Stefan Hendriks 09.02.2011, 09:58
quelle

4 Antworten

4

Ich denke, das hat etwas mit den Typparametern für dienstverbandMap zu tun. Die Injektion kann nur dann sicher durchgeführt werden, wenn Spring feststellen kann, dass die Bean-Instanz (a HashMap ) tatsächlich als HashMap<String, String> instanziiert wurde. Spring könnte die Typparameter verlieren, da der deklarierte Typ der Bean ein unformatierter Typ ist.

Eine andere Möglichkeit ist, dass die Ergebnissignatur der Factory-Methode falsch ist; z.B. Karte anstelle von HashMap oder eine rohe HashMap anstelle von HashMap<String, String> .

(Einige dieser Theorien könnten widerlegt werden, wenn Sie uns die Erklärung der Fabrikmethode zeigen würden.)

Übrigens wird das Attribut class gemäß den Kommentaren in den 2.0-DTD- und 3.0-XSD-Dateien von spring-beans nicht verwendet, wenn Sie ein factory-bean -Attribut angeben. Hast du versucht, es komplett auszulassen?

    
Stephen C 09.02.2011, 10:15
quelle
5

3.11.3. Automatisches Annotations-Autowinding mit Qualifiern optimieren:

Quote: Wenn Sie Annotations-gesteuerte Injektion mit Namen ausdrücken möchten, verwenden Sie nicht in erster Linie @Autowired - auch wenn es technisch möglich ist, über @Qualifier-Werte auf einen Bean-Namen zu verweisen. Ziehen Sie stattdessen die JSR-250 @Resource-Annotation vor, die semantisch definiert ist, um eine bestimmte Zielkomponente anhand ihres eindeutigen Namens zu identifizieren, wobei der deklarierte Typ für den Abgleichsprozess irrelevant ist.

Als eine spezifische Konsequenz dieses semantischen Unterschieds können Beans, die selbst als Sammel- oder Kartentyp definiert sind, nicht über @Autowired injiziert werden, da die Typübereinstimmung nicht richtig auf sie angewendet werden kann. Verwenden Sie @Resource für solche Beans, indem Sie auf die spezifische Sammlung / Map-Bean anhand des eindeutigen Namens verweisen.

    
Erhan Bagdemir 09.02.2011 10:15
quelle
0

Ich bin mir ziemlich sicher, dass Ihre Factory-Methode java.util.Map , nicht java.util.HashMap zurückgibt. Ich denke, Sie könnten das wahrscheinlich tun:

%Vor%

Haftungsausschluss: Ich bin nicht sicher, ob Spring Sie das tun lassen wird, da Map eine Schnittstelle ist, aber es ist einen Versuch wert.

    
Sean Patrick Floyd 09.02.2011 10:14
quelle
0

Die Bean-Definition für die Map enthält nicht die Typparameter, daher kann die automatische Verdrahtung nicht bestätigen, dass sie vom richtigen Typ ist.

Wenn Sie <util:map> verwenden, können Sie die Typparameter angeben, aber dann können Sie offensichtlich Ihre eigene Factory-Methode nicht verwenden. Die einzige andere Lösung besteht darin, dass Ihre Bean eine rohe Map (bad) benötigt oder die Maps in der Bean-Definition (besser) explizit verknüpft.

    
OrangeDog 09.02.2011 10:32
quelle

Tags und Links