Die Intersult liefert die wohl führenden XML- und SOAP-Werkzeuge im Java-Bereich. Das XML-Paket kann unter Maven 2 direkt aus dem Intersult Maven Repository integriert werden.

Maven2#

The plugin is accessible using the following ids:
  • groupId: com.intersult
  • artifactId: com.intersult.xml

Simply add the plugin repository to your pom.xml to allow Maven download the plugin:

<project>
    ...
    <pluginRepositories>
        ...
	<pluginRepository>
            <id>intersult-repository</id>
	    <name>Intersult Repository</name>
	    <url>http://repository.intersult.com/repository</url>
	</pluginRepository>
	...
    </pluginRepositories>
    ...
</project>

Marshalling#

Der XmlMarshaller ist ein sehr flexibles Werkzeug für die Umwandlung von Java-Objekten in XML. Es braucht sich um keine speziellen Objekte handeln, sogenannte Pojos sind ausreichend. Zusätzlich besteht die Möglichkeit durch einige Annotations das Marshalling zu steuern.

Neben primitiven Datentypen und verschachtelten Typen serialisiert der Marshaller auch Arrays, Lists und Maps.

Der XmlUnmarshaller wandelt serialisierte XML-Dateien zurück in Java-Klassen. Das Unmarshalling ist dabei genauso unkompliziert wie das Marshalling. Pojos sind ausreichend, mit Annotationen können zusätzliche Features gesteuert werden.

Folgendes Code-Beispiel zeigt einen Unmarshal-Marshal-Roundtrip:

    String stringInput = IOUtils.toString(getClass().getResourceAsStream("Foo.xml"));
    Foo foo = (Foo)MarshalUtils.unmarshall(stringInput);
    String stringOutput = MarshalUtils.marshall(foo);

Mit Foo.xml:

<?xml version="1.0" encoding="UTF8"?>
<com.intersult.xml.Foo value="Ein Wert"/>

und Foo.java:

package com.intersult.xml;

public class Foo {
	private String value;

	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
}

Ein weiteres Beispiel für Unmarshalling:

    String input = "Test";
    String xml = "<java.lang.String>" + input + "</java.lang.String>";
    String output = (String)MarshalUtils.unmarshall(xml);

Xsd-Generierung#

Der Xsd-Generator generiert aus einer XML-Schema-Datei (Dateiendung .xsd) die entsprechenden Java-Klassen. Die Generierung kann entweder durch den Aufruf der Klasse com.intersult.xml.xsd.Xsd erfolgen - oder bequemer durch Maven2-Integration:
<project>
    ...
    <build>
        ...
        <plugins>
            ...
            <plugin>
		<groupId>com.intersult</groupId>
		<artifactId>com.intersult.maven</artifactId>
		<executions>
		    <execution>
			<goals>
		    	    <goal>generate-schema</goal>
			</goals>
			<configuration>
			    <schemas>
				<schema>
			            <xsdPath>${project.build.directory}/generated/schema</xsdPath>
				    <xsd>http://www.w3.org/2001/XMLSchema.xsd</xsd>
				</schema>
			    </schemas>
			</configuration>
		    </execution>
		</executions>
	    </plugin>
	    ...
	</plugin>
	...
    </build>
    ...
</project>

Die Generierung ist in den Maven2-Build-Zyklus integriert. Dadurch wird der Code zu genau dem richtigen Zeitpunkt generiert und erscheint z.B. auch in Eclipse-Projekten als Source-Folder.

Die Xsd-Generierung ist derart mächtig, dass sie sogar Java-Dateien für das XSD-Schema generieren kann. Das XSD-Schema ist das Schema für ein XML-Schema, also auch das Schema für sich selbst. Das WSDL-Schema kann damit ebenfalls abgebildet werden.

Optionale Parameter zur Konfiguration der Xsd-Generierung:

AttributBeschreibung
processIncludesEin Xsd-Schema kann Include-Anweisungen enthalten. Wird processIncludes auf den Wert true gesetzt, werden die in den Include-Anweisungen spezifizierten Xsd-Schemata geladen und ebenfalls Code dafür generiert. Wird der Package-Name spezifiziert, wird dieser auf die geladenen Schemata vererbt.
xsdPackagePackage-Pfad, der bei der Generierung des Java-Code verwendet werden soll. Wird kein Package-Name festgelegt, wird der natürliche Package-Name aus dem Target-Namespace generiert. Der natürlich Package-Name sind die Namenskomponenten des Hostnames des URI in umgekehrter Reihenfolge gefolgt von den Komponenten des Pfads des URI, jeweils getrennt durch das Package-Trennzeichen '.' (den Punkt).
generateEnumPer Default werden Strings statt Enums generiert, Da in Java nur ein sehr eingeschränkter Zeichenvorrat dafür akzeptiert wird. Dieses Feature kann in einer späteren Version durch Annotations ergänzt werden und per Default auf true gesetzt werden.

Web Service#

Die Generierung von Web Services aus WSDL-Dateien baut zum Teil auf der Generierung von XML-Schemata aus XSD-Dateien auf. Durch folgende Konfiguration kann ein Web Service Client generiert werden:
<project>
    ...
    <build>
        ...
        <plugins>
            ...
        	<plugin>
	            <groupId>com.intersult</groupId>
		    <artifactId>com.intersult.maven</artifactId>
		    <executions>
			<execution>
		            <goals>
				<goal>generate-ws</goal>
			    </goals>
			    <configuration>
				<services>
			    	    <service>
				        <outputPath>${project.build.directory}/generated/weather</outputPath>
				        <wsdl>http://www.webservicex.net/globalweather.asmx?WSDL</wsdl>
				        <packageName>net.webservicex.globalweather</packageName>
				    </service>
			        </services>
			    </configuration>
			</execution>
		    </executions>
	        </plugin>
	    ...
	</plugin>
	...
    </build>
    ...
</project>

Der Global Weather Service generiert einen Service, der durch folgenden Code ansprechbar ist:

    GetWeatherResponse weather = new GlobalWeatherSoap().getWeather("nuernberg", "germany");
    System.out.println(weather.getGetWeatherResult());