Spring und Bean vom Typ "DecimalFormat" - Merkwürdige Exception

DarthShader

Erfahrenes Mitglied
Hallo zusammen,

ich habe in meiner Spring Appcontext XML Konfiguration u.A. eine Bean so angelegt:

XML:
<bean id="decimalFormatter0" class="java.text.DecimalFormat">
	<constructor-arg value="#" />
</bean>

Ich kann einer anderen Bean jetzt diesen Formatter injizieren, kein Problem. Aber wenn auch nur ein Fehler in meiner XML Konfiguration ist, an einer ganz anderen Stelle, dann wirft mir Spring die korrekte Exception, und ZUSÄTZLICH sagt er immer:

Related cause:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'java.text.DecimalFormat#1478a43' defined in resource loaded through SAX InputSource:
Unsatisfied dependency expressed through constructor argument with index 0 of type [java.util.Locale]: Ambiguous factory method argument types - did you specify the correct bean references as factory method arguments?

Und das überall da, wo ich die Bean "decimalFormatter0" in der XML Konfiguration verwende. Da das sehr oft ist, habe ich unglaublich lange Exception-Ausgaben, sobald etwas nicht stimmt.

Ich kann den DecimalFormat in Java ja auch einfach so instanziieren:

Java:
DecimalFormat df = new DecimalFormat( "#" );

ohne, dass eine Exception geworfen wird.

Es ergeben sich also jetzt folgende Fragen:

1. Warum wird diese merkwürdige Exception nur dann von Spring geworfen, wenn auch etwas anderes, an einer ganz anderen Stelle, in der XML Konfiguartion etwas nicht stimmt?

2. Warum wird die Exception überhaupt geworfen, wenn ich DecimalFormat doch genau so normal instanziieren kann?


Über Hilfe würde ich mich sehr freuen


Vielen Dank!
 
Zuletzt bearbeitet von einem Moderator:
Mich verwirren da mehrere Sachen: zum einen, dass da von einer FactoryMethod gesprochen wird, die du anscheinend nicht benutzt. Zum anderen ist der Beanname ein anderer als der, den du in deiner Beispielkonfiguration angibst. Diese Hashwerte als Beanname werden eigentlich nur vergeben, wenn gar keine Id angegeben wird. Hast du da evtl. irgendwo welche von rumliegen?

Dieser Exceptiontyp fliegt in den meisten Fällen, wenn der Typ des Konstruktorarguments nicht genau bestimmt werden kann. Hast du z.B. einen Konstruktor der ein Integer entgegen nimmt und einen der eine String entgegennimmt und du gibst als value z.B. "2" an. Dann ist nicht klar, welcher benutzt werden soll. Soweit ich das seh ist das aber in deinem Fall gar nicht der Fall. Merkwürdig ist auch, dass er Locale als Typ erwartet. Rätsel über Rätsel ;).

Was du evtl. machen könntest - was aber nur ein Workaround ist - ist, eine Implementierung von FactoryBean zu erstellen, die dann das DecimalFormat erzeugt.

REINHAUN!
 
Mich verwirren da mehrere Sachen: zum einen, dass da von einer FactoryMethod gesprochen wird, die du anscheinend nicht benutzt.

Nach diesem Satz habe ich meine XML Dateien nochmal untersucht. Und ich habe doch tatsächlich an nur EINER stelle einmal die "getInstance" Factory Methode von DecimalFormat benutzt. Ich habe das nun entfernt, und diese merkwüriden "Related cause" Exceptions sind weg.

Ich frage mich dennoch, wieso das auftauchte, und das bleibt wohl auch ein Rätsel. Ich glaube das ist aber sehr leicht reproduzierbar, einfach mal eine Bean der Klasse DecimalFormat erzeugen, die factory methode "getInstance" in der Bean definition benutzen und irgendwo anders in der XML einen Fehler einbauen. Jedenfalls hier klappt diese Reproduktion des Fehlers immer wieder.
 
Dann macht die Exception ja auch Sinn: Spring versucht diese eine Bean, die sicher irgendwo referenziert wird, über diese Factorymethode zu instantiieren. Wenn du da nun einen KOnstruktorparameter definierst wird der automatisch zu einem Methodenparameter der Factorymethode. DecimalFormat hat nur eine getInstance Methode mit einem Parameter und dieser ist vom Typ Locale. Nun scheitert Spring daran dein # in ein Locale zu konvertieren. ;) Ergo, alles Richtig gemacht Spring ;)

REINHAUN!

REINHAUN!
 
Hm ja, das klingt natürlich sinnig. Die Exception an sich macht also Sinn, aber warum diese Geschichte mit dem "Related cause:" wenn ein ganz anderer Fehler vorlag? Und wenn alles stimmte, hat Spring auch nicht beim DecimalFormat gemeckert.
 
Hm, naja, Spring kann eine Bean nicht instantiieren, weil eine gaaaanz andere Bean nicht instantiiert werden kann. Wie die genau zwischen Rootcause und Related cause unterscheiden, weiß ich allerdings auch nicht ;)

REINHAUN!
 
Hallo Oliver,

ich weiß, der Thread ist schon relativ alt, aber leider ist mein Problem wieder einmal aufgetretet, ich kann es mir einfach nicht erklären. Meine XML Konfiguration für solch eine DecimalFormat Bean sieht so aus:

XML:
<bean id="decimalFormatter0.0" class="java.text.DecimalFormat">
	<constructor-arg value="0.0" />
</bean>

Was mir Spring nun sagt ist:

....
Related cause: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'decimalFormatter0.0' defined in resource loaded through SAX InputSource:
Unsatisfied dependency expressed through constructor argument with index 1 of type [java.text.DecimalFormatSymbols]: Ambiguous constructor argument types - did you specify the correct bean references as constructor arguments?

Ich verstehe das nicht, es gibt doch nur einen Konstruktor "DecimalFormat(String pattern)", wieso hat Spring Schwierigkeiten, das zu instanziieren?


Über nochmalige Hilfe würde ich mich sehr freuen :)

Danke!
 
Zuletzt bearbeitet von einem Moderator:
Kann es sein, dass deine wirkliche Bean ein parent Attribut hat? Die Exception sagt, dass der Index 1 ambiguos ist. DecimalFormat hat aber nur einen Konstruktor mit (String, DecimalFormatSymbols), d.h. irgendwie muss der Konstruktorparameter den du da definiert hast, als zweiter gedeutet werden. Dies ist im allgemeinen der Fall, wenn die Bean einen parent definiert hat, die selbst ein Konstruktorargument definiert.

Gruß
Ollie
 
Nein die Bean hat keinen Parent - so wie ich sie oben gepostet habe, ist sie auch bei mir in der XML Konfiguration. Ich verstehe diese Fehlermeldung von Spring auch nicht.

Sicher hat es etwas damit zu tun, dass der Fehler von Spring immer nur im Zusammenhang mit anderen Beans angezeigt wird. Bekommt also eine Bean A die DecimalFormat-Bean injiziert, und die Bean A hat einen Fehler, so wird eben dieser Fehler der Bean A angezeigt und _zusätzlich_ noch der Fehler mit der DecimalFormat-Bean.

Ich bin total verwirrt, wie kann das nur sein?
 

Neue Beiträge

Zurück