Gibt es eine PropertyPlaceholderConfigorer-ähnliche Klasse zur Verwendung mit Spring, die XML akzeptiert?

8

Spring hat eine sehr praktische Convenience-Klasse namens PropertyPlaceholderConfigurer , die eine Standarddatei mit der Erweiterung .properties übernimmt und Werte daraus in die Konfiguration "bean.xml" einfügt.

Kennt jemand eine Klasse, die genau dasselbe tut, und integriert sich auf dieselbe Weise mit Spring, akzeptiert aber XML-Dateien für die Konfiguration. Insbesondere denke ich an Apache Digester-Config-Dateien. Es wäre einfach genug, dies zu tun, ich frage mich nur, ob jemand schon hat.

Vorschläge?

    
GaryF 26.01.2009, 13:54
quelle

4 Antworten

7

Ich habe das gerade getestet und es sollte einfach funktionieren.

PropertiesPlaceholderConfigurer enthält eine setPropertiesPersister-Methode, sodass Sie Ihre eigene Unterklasse von EigenschaftenPersister . Der standardmäßige PropertiesPersister unterstützt bereits Eigenschaften im XML-Format.

Nur um Ihnen den voll funktionsfähigen Code zu zeigen:

JUnit 4.4 Testfall:

%Vor%

Die Spring-Konfigurationsdatei test-config.xml

%Vor%

Die XML-Eigenschaftendatei properties.xml - siehe hier zur Beschreibung der Verwendung.

%Vor%

Und schließlich die Bohne:

%Vor%

Hoffe, das hilft ...

    
toolkit 26.01.2009, 16:32
quelle
4

Sie haben herausgefunden, dass Spring Modules eine Integration zwischen Spring und Commons Configuration bietet, die eine hierarchische Struktur hat XML-Konfigurationsstil Dies bindet direkt an PropertyPlaceholderConfigurer, was genau das ist, was ich wollte.

    
GaryF 29.01.2009 13:32
quelle
3

Ich habe versucht, selbst eine schöne Lösung zu finden, die

  1. Dreht sich um das Erstellen eines XSD für die Konfigurationsdatei - da ich den Vorteil der Verwendung von XML habe, dass Sie die Konfigurationsdatei in Bezug auf die Datentypen stark eingeben können und welche Felder obligatorisch / optional sind
  2. Validiert das XML gegen die XSD, wenn also ein Wert fehlt, wird ein Fehler ausgegeben, anstatt dass Ihre Bean mit einem 'Null' injiziert wird
  3. Verlässt sich nicht auf Spring-Annotationen (wie @Value - in meinen Augen gibt das Beans Wissen über ihre Container + Beziehung mit anderen Beans, bricht also IOC)
  4. Validiert die Quell-XML-Datei gegen die XSD. Wenn Sie also versuchen, auf ein XML-Feld zu verweisen, das im XSD nicht vorhanden ist, wird auch ein Fehler ausgegeben.
  5. Die Bean weiß nicht, dass ihre Eigenschaftswerte aus XML importiert werden (d. h. ich möchte einzelne Eigenschaften und nicht das XML-Objekt als ganzes injizieren)
Was ich mir ausgedacht habe, ist wie unten, Entschuldigung, das ist ziemlich langatmig, aber ich mag es als eine Lösung, da ich glaube, dass es alles abdeckt. Hoffentlich könnte sich das für jemanden als nützlich erweisen. Triviale Stücke zuerst:

Die Bean, in die Eigenschaftswerte injiziert werden sollen:

%Vor%

Testen Sie die Klasse, um die obige Bean zu erstellen und die darin enthaltenen Eigenschaftswerte auszugeben:

%Vor%

MyConfig.xsd:

%Vor%

Beispiel für die Datei MyConfig.xml basierend auf dem XSD:

%Vor%

Snippet der Datei pom.xml zum Ausführen von xsd2java (es gab außer der Einstellung auf Java 1.6 und der Abhängigkeit vom Spring-Kontext nicht viel anderes):

%Vor%

Jetzt das Quell-XML selbst. Dies erstellt ein Schema / Validator, dann JAXB verwendet, um einen Unmarshaller zu erstellen, um ein POJO aus der XML-Datei zu erstellen, und verwendet dann Spring # Annotation, um Eigenschaftswerte durch Abfragen des POJO einzufügen:

%Vor%     
nigelg 05.05.2013 11:28
quelle
2

Ich bin nicht sicher über die Apache Digester-Config-Dateien, aber ich fand eine Lösung, die nicht so schwer zu implementieren und passend für meine XML-Konfigurationsdatei war.

Sie können den normalen PropertyPlaceholderConfigurer von spring verwenden, aber um Ihre benutzerdefinierte Konfiguration zu lesen, müssen Sie Ihren eigenen PropertiesPersister erstellen, wo Sie das XML (mit XPath) analysieren und die erforderlichen Eigenschaften selbst festlegen können.

Hier ist ein kleines Beispiel:

Erstellen Sie zuerst Ihren eigenen PropertiesPersister, indem Sie den Standardnamen erweitern:

%Vor%

Fügen Sie dann den CustomPropertiesPersister in den PropertyPlaceholderConfigurer im Anwendungskontext ein:

%Vor%

Danach können Sie Ihre Eigenschaften wie folgt verwenden:

%Vor%     
Michael 25.05.2011 09:05
quelle

Tags und Links