mich selbst versucht, dies mit einer schönen Lösung zu kommen, dass
- Revolves um ein XSD für die Config-Datei erstellen - da das gesamte Nutzen XML der Verwendung in meinem Kopf ist, dass Sie stark eingeben können die Konfigurationsdatei in Bezug auf Datentypen und welche Felder obligatorisch/optional sind
- Validiert die XML gegen die XSD, wenn also ein Wert fehlt, wird ein Fehler ausgegeben, anstatt dass Ihre Bean mit einem 'Null' injiziert wird '
- Stützt sich nicht auf Spring-Annotationen (wie @Value - in meinen Augen gibt das Bohnen Wissen abo ut ihre container + Beziehung mit anderen Bohnen, so bricht IOC)
- Will validieren die Feder XML gegen die XSD, wenn Sie also versuchen, ein XML-Feld verweisen nicht in der XSD, wird es auch einen Fehler zu werfen
- Die Bean weiß nicht, dass ihre Eigenschaftswerte aus XML importiert werden (d. H Ich möchte auf einzelne Eigenschaften injizieren, und nicht das XML-Objekt als Ganzes)
Was ich kam mit, wie unten ist, Entschuldigungen dies ziemlich langatmig, aber Ich mag es als eine Lösung, da ich glaube, es deckt alles. Hoffentlich könnte sich das für jemanden als nützlich erweisen. Trivial Stücke zuerst:
Die Bohne I Eigenschaftswerte in injiziert werden soll:
package com.ndg.xmlpropertyinjectionexample;
public final class MyBean
{
private String firstMessage;
private String secondMessage;
public final String getFirstMessage()
{
return firstMessage;
}
public final void setFirstMessage (String firstMessage)
{
this.firstMessage = firstMessage;
}
public final String getSecondMessage()
{
return secondMessage;
}
public final void setSecondMessage (String secondMessage)
{
this.secondMessage = secondMessage;
}
}
Test-Klasse, um die oben Bean zu erstellen und die Eigenschaftswerte auskippen es bekam:
package com.ndg.xmlpropertyinjectionexample;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public final class Main
{
public final static void main (String [] args)
{
try
{
final ApplicationContext ctx = new ClassPathXmlApplicationContext ("spring-beans.xml");
final MyBean bean = (MyBean) ctx.getBean ("myBean");
System.out.println (bean.getFirstMessage());
System.out.println (bean.getSecondMessage());
}
catch (final Exception e)
{
e.printStackTrace();
}
}
}
MyConfig.xsd :
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:myconfig="http://ndg.com/xmlpropertyinjectionexample/config" targetNamespace="http://ndg.com/xmlpropertyinjectionexample/config">
<xsd:element name="myConfig">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="someConfigValue" type="xsd:normalizedString" />
<xsd:element minOccurs="1" maxOccurs="1" name="someOtherConfigValue" type="xsd:normalizedString" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Beispiel MyConfig.xml Datei auf dem XSD basiert:
<?xml version="1.0" encoding="UTF-8"?>
<config:myConfig xmlns:config="http://ndg.com/xmlpropertyinjectionexample/config">
<someConfigValue>First value from XML file</someConfigValue>
<someOtherConfigValue>Second value from XML file</someOtherConfigValue>
</config:myConfig>
Snippet pom.xml Datei xsd2java zu laufen (war hier nicht viel anderes als Java-Einstellung 1,6 und Feder-Kontextabhängigkeit):
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>main-xjc-generate</id>
<phase>generate-sources</phase>
<goals><goal>generate</goal></goals>
</execution>
</executions>
</plugin>
nun die Feder XML selbst. Dadurch entsteht ein Schema/Validator, dann JAXB verwendet einen Unmarshaller erstellen POJO aus der XML-Datei zu erstellen, dann spring # Anmerkung verwendet, indem Quering die POJO Eigenschaftswert zu injizieren:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd" >
<!-- Set up schema to validate the XML -->
<bean id="schemaFactory" class="javax.xml.validation.SchemaFactory" factory-method="newInstance">
<constructor-arg value="http://www.w3.org/2001/XMLSchema"/>
</bean>
<bean id="configSchema" class="javax.xml.validation.Schema" factory-bean="schemaFactory" factory-method="newSchema">
<constructor-arg value="MyConfig.xsd"/>
</bean>
<!-- Load config XML -->
<bean id="configJaxbContext" class="javax.xml.bind.JAXBContext" factory-method="newInstance">
<constructor-arg>
<list>
<value>com.ndg.xmlpropertyinjectionexample.config.MyConfig</value>
</list>
</constructor-arg>
</bean>
<bean id="configUnmarshaller" class="javax.xml.bind.Unmarshaller" factory-bean="configJaxbContext" factory-method="createUnmarshaller">
<property name="schema" ref="configSchema" />
</bean>
<bean id="myConfig" class="com.ndg.xmlpropertyinjectionexample.config.MyConfig" factory-bean="configUnmarshaller" factory-method="unmarshal">
<constructor-arg value="MyConfig.xml" />
</bean>
<!-- Example bean that we want config properties injected into -->
<bean id="myBean" class="com.ndg.xmlpropertyinjectionexample.MyBean">
<property name="firstMessage" value="#{myConfig.someConfigValue}" />
<property name="secondMessage" value="#{myConfig.someOtherConfigValue}" />
</bean>
</beans>
das auf jeden Fall praktisch zu wissen, und wird ein handliches Backup sein.Ich denke, es ist einfach genug, PropertiesPersister außer Kraft zu setzen, um das Apache Digester-Stil-Parsing statt des Standard-XML-Formats zu implementieren. – GaryF
Was würde es dauern, um etwas zu erstellen, das benutzerdefinierte (Nicht-Eigenschaften) XML-Dateien mit Ressourcenladeprogrammen lädt? –