Spring: Injizieren von Enums

DarthShader

Erfahrenes Mitglied
Hallo,

ich möchte gerne per Spring Framework einem Objekt ein Enum injizieren. Hier ein Beispiel der XML Konfiguration:

Code:
<property name="button.userObject">
	<bean class="de.tutorials.spring.Example$InnerEnum" factory-method="valueOf">
		<constructor-arg value="SEIN" />
	</bean>
</property>

Wobei "InnerEnum" ein public Enum innerhalb der Klasse "de.tutorials.spring.Example" ist und "SEIN" einer der Werte des Enums.

Das ganze funktioniert gut so. Meine Frage wäre lediglich: Ich habe gehört, dass man mit Spring > 2.0 dieses Enum-Injizieren einfacher machen kann (vielleicht mit XML namespaces von Spring). Ich kann in der Spring Doku aber nichts hilfreiches darüber finden. Weiß jemand zufällig, ob das obige auch einfacher, sprich kürzer geht?


Vielen Dank für Eure Hilfe
 
XML:
<property name="foo" value="ENUM" />

Spring löst den genauen typ über den Parametertyp des Setters auf. Es reicht also den Enum wert als String hinzuschreiben.

Gruß
Ollie
 
Zuletzt bearbeitet von einem Moderator:
Hallo Ollie,

vielen Dank für den Vorschlag. Deine Lösung ist natürlich ideal, aber leider habe ich in meinem ersten Post vergessen zu erwähnen, dass die Bean Property meiner Klasse nicht den Enum Typen erwartet, sondern lediglich "Object". Die Signatur sieht so aus:

public void setUserObject( Object userObject ) { ... };

Das heißt, Spring kann den Enum Typen nicht durch die Setter Methode ermitteln bzw. würde dann ein String Objekt zuweisen.

Ich meine aber irgendwo, irgendwann einmal gelesen zu haben, dass es auch in solch einem Szenario eine viel kompaktere/schlankere Art und Weise gibt, den Enum zuzuweisen. Aber ich finde diese Lösung einfach nicht mehr. Das sah so ähnlich aus wie

Code:
<property name="button.userObject" p:enum="de.tutorials.spring.Example$InnerEnum" value="SEIN" />

Irgendwas in der Art und Weise. Meine Lösung ganz oben funktioniert zwar ,aber bei der Menge an XML Code versuche ich momentan jeden Overhead zu vermeiden und die Lesbarkeit soweit wie möglich zu verbessern :)

Danke
 
Ich denke ich habe eben eine mögliche Lösung gefunden. Nutzt man den util namespace, so kann man <util:constant> benutzen, um statische Member zu injizieren. In meinem Fall sieht das dann so aus:

XML:
<property name="button.userObject">
	<util:constant static-field="de.tutorials.spring.Example$InnerEnum.SEIN" />
</property>

Das sieht doch schonmal ein wenig netter und kompakter aus.
 
Zuletzt bearbeitet von einem Moderator:
Den p-Namespace, den du angesprochen hast, verwendet man direkt am bean element, um Platz zu sparen:

XML:
<bean ...>
  <property name="foo" value="bar" />
</bean>
ist äquivalent zu
XML:
<bean ... p:foo="bar" />

Darf ich fragen warum du den Setterparameter nicht stärker typisierst. Sobald du das Ding verwenden willst musst du doch eh wissen, was da genau drin steht, oder?

Gruß
Ollie
 
Zuletzt bearbeitet von einem Moderator:
Darf ich fragen warum du den Setterparameter nicht stärker typisierst. Sobald du das Ding verwenden willst musst du doch eh wissen, was da genau drin steht, oder?

Es ist klar eine Schwäche des OOP-Designs hier diesem Projekt, das gebe ich zu. Es dreht sich um eine allgemeine Button-Komponente, die eben ein property "userObject" hat, um mit der Komponente beliebige Objekte zu assoziieren. Ich habe hier gerade nicht die Möglichkeit, eine andere Komponente zu verwenden, oder von der Klasse abzuleiten.

Ich nutze das userObject property des Buttons, um dort eben den entsprechenden Enum "anzuhängen". Natürlich muss ich bei der Verwendung später wissen, was sich hinter dem userObject befindet, was einen expliziten Cast erfordert.

Daher typisiere ich es nicht stärker und es muss bei einem sehr allgemeinen Object bleiben. Die p-Notation in Spring ist natürlich sehr schön kompakt, aber ich denke ich kann mit meiner util:constant Methode ganz gut leben (es sei denn, man könnte es noch kompakter hinbekommen? :).

Danke
 

Neue Beiträge

Zurück