Web Services mit Spring WS und JAXB
Der Web-Descriptor
Nachdem wir die Spring-Konfiguration bereits hinter uns gelassen haben, brauchen wir nur noch die web.xml konfigurieren. Hier benötigen wir lediglich das MessageDispatcherServlet, das von Spring WS geliefert wird (Listing 12).
Listing 12
Product Catalogue Service spring-ws o.s.ws.t.http.MessageDispatcherServlet contextConfigLocation classpath:META-INF/spring/spring-ws-servlet.xml transformWsdlLocations true spring-ws /*
Über den Parameter contextConfigLocation geben Sie die zu verwendenden Spring-Konfigurationen an. Mit dem zweiten Parameter werden alle URIs in der WSDL mit dem aktuellen Servernamen überschrieben.
Testen der Anwendung
Jetzt ist der Zeitpunkt gekommen, die Anwendung zu testen. Da die Anwendung ja einen Web Service bereitstellt, ist es eine gute Idee, diese auf einen Webcontainer zu deployen. Dafür bietet sich Tomcat an. In Eclipse starten Sie die Anwendung mit RUN AS… | RUN ON SERVER. Nach wenigen Sekunden ist die Anwendung deployt und Sie können die WSDL unter http://localhost:8080/articles-spring-ws-dom/productService/product.wsdl aufrufen. Zum Testen der Anwendung brauchen Sie aber mehr als einen simplen Aufruf der WSDL. Mit SoapUI [8] gibt es ein leistungsfähiges Web-Service-Testing-Tool. In dem Verzeichnis soapui befindet sich ein SoapUI-Projekt. Öffnen Sie dieses und führen Sie den Web Service Request aus. Als Ergebnis sollten Sie eine SOAP-Message erhalten, die zwei Produkte enthält. Eigentlich wären wir jetzt fertig. Es gibt aber noch eine Stelle, die direkt verbessert werden kann. Der DateRangeType, der aus dem XML Schema generiert wird, verwendet nicht die Calendar/Date-Klassen aus dem JDK, sondern javax.xml.datatype.XMLGregorianCalendar. Hier wäre es schön, wenn anstatt dieser Calendar-Implementierung java.util.Date verwendet würde. Das muss dem XJC-Generator mitgeteilt werden, was direkt in dem XML Schema passieren kann (Listing 13).
Listing 13
Für den XML-Schema-Datentyp DateTime bietet JAXB bereits einen Konverter: javax.xml.bind.DatatypeConverter. Die Methoden, die zum Parsen bzw. zur Ausgabe des Datums herangezogen werden, heißen parseDateTime bzw. printDateTime.
Für den Datentyp date gibt es keine Entsprechung. Da der Request keine Zeitangabe enthalten soll, sondern nur eine Datumsangabe, brauchen wir einen Konverter für diesen Datentyp. Dazu verwenden wir die Klasse de.itemis.hoa.spring.ws.adapter.DateAdapter. Die Methoden heißen genauso wie die Methoden für den DateTime-Konverter. Die Implementierung des Konverters ist denkbar einfach (Listing 14).
Listing 14
public class DateAdapter { public static Date parseDateTime(String s) { return DatatypeConverter.parseDateTime(s).getTime(); } public static String printDateTime(Date dt) { Calendar cal = new GregorianCalendar(); cal.setTime(dt); return DatatypeConverter.printDateTime(cal); } }
Wenn Sie die Klassen aus dem Schema neu generieren lassen, wird von nun an java.util.Date für die Datumsattribute in der Klasse DateRangeType verwendet.
Zusammenfassung
Die Lösung mit JAXB ist ein deutlicher Schritt nach vorne. Die Arbeit mit XML entfällt ganz und Spring WS übernimmt den Großteil der Konfiguration (Marshaller). Die Arbeit mit einem Web Service fällt viel leichter, da man lediglich eine Klasse und eine Methode annotieren muss, um einen gültigen Endpoint zu kreieren. Im dritten und letzten Teil dieser Artikelserie, werden wir uns dem Testen von Web Services zuwenden und das Thema „Security“ beleuchten.
Hinterlasse einen Kommentar