Enterprise/Web Services mit Spring WS

Web Services mit Spring WS und JAXB

Thorsten Kamann

Da wir bereits die pom.xml in Bearbeitung haben, können wir die beiden fehlenden Abhängigkeiten konfigurieren: spring-ws-core-tiger und jaxb-impl. Die erste Abhängigkeit ermöglicht es uns, den Endpoint mit Annotations zu versehen. Listing 4 zeigt die Konfiguration der Abhängigkeiten.

Listing 4

org.springframework.wsspring-ws-core-tiger1.5.8com.sun.xml.bindjaxb-impl2.1.12
Das Domänenmodell und der Service

Das Domänenmodell hat sich zu Teil 1 nicht verändert. Wir haben die vier Domänenklassen Product, Supplier, Category und DateRange (Abb. 4), ebenso ist der ProductService unverändert (Abb. 5). Der ProductService hat genau eine Methode. Damit können Sie eine Liste von Products abfragen, die von einem bestimmten Lieferanten (Supplier) in einem Datumsbereich (DateRange) geliefert wurden. Für eine Verfeinerung der Liste geben Sie noch eine Kategorie (Category) mit an.

Abb. 4: Das Domänenmodell

Abb. 5: Der ProductService

Der ProductService wird als SpringBean konfiguriert. Dazu versehen wir die Klasse mit der @Service-Annotation. Später wird Spring so konfiguriert, dass beim Start der Webanwendung diese Annotation berücksichtigt und der ProductService zum Spring-Kontext hinzugefügt wird. Die Implementierung, die wir hier verwenden, gibt immer eine Liste von zwei Produkten zurück.

Der Endpoint

Wie auch im Beispiel des ersten Teils wird ein Endpoint benötigt. Der Endpoint beantwortet die Anfragen der Web-Service-Konsumenten. Ein solcher Endpoint muss in der Lage sein, die Anfrage zu verstehen und die Anfragedaten zu bearbeiten. Die zweite Aufgabe besteht darin, eine Antwort an den Konsumenten zu senden. In diesem Beispiel wollen wir sowohl JAXB als auch Annotationen verwenden, um den Endpoint zu implementieren. Das hat den großen Vorteil, dass wir von keiner Klasse erben oder ein Interface implementieren müssen. Das Grundgerüst des Endpoints ist denkbar einfach: Wir benötigen lediglich eine Klasse mit einer Methode. Diese Methode kann einen beliebigen Namen haben. Mit einer Annotation deklarieren wir diese Methode später als Web-Service-Methode. Die Methode benötigt einen Parameter, der den Inhalt des Requests enthält. Zum Gegensatz der Methode aus dem ersten Teil besteht der Inhalt dieses Parameters nicht aus XML-Daten, sondern aus den Objekten von unserem generierten Klassenmodell (Abb. 5). In dem XML Schema haben wir ein Element definiert, das einen Request beschreibt: ProductRequest. Zu diesem Element gibt es eine entsprechende Java-Klasse, die wir jetzt als Parameter für die Web-Service-Methode verwenden. Der Rückgabewert ist ebenfalls das Java-Pendant zu dem Element aus dem XML Schema: ProductResponse. In Listing 5 sehen Sie den Rumpf des Endpoints.

Listing 5
public class ProductServiceEndpoint {
  public ProductResponse getProducts(ProductRequest productRequest) {
    return null;
  } 
}

Im Package org.springframework.ws.server.endpoint.annotation befinden sich drei Annotations:

  • Endpoint
  • PayloadRoot
  • XPathParam

In unserem Beispiel verwenden wir die ersten beiden Annotations. Die Endpoint-Annotation kennzeichnet eine Klasse als Endpoint. Die PayloadRoot-Annotation kennzeichnet eine Methode als Web-Service-Methode. Diese Annotation erwartet zwei Parameter:

  • localPart
  • namespace

Der localPart ist der Name des Elements, das den Request definiert. Der Namespace ist derjenige, den Sie im XML Schema angegeben haben. Wenn wir den Rumpf des Enpoints mit den Annotations versehen, sieht die Klasse bereits etwas besser aus (Listing 6).

Listing 6
@Endpoint
public class ProductServiceEndpoint {
  public final static String NAMESPACE = 
    "http://www.itemis.de/hoa/spring/ws/product";
  public final static String GET_TIMESHEET_REQUEST = "ProductRequest";

  
  @Autowired
  private ProductService productService;

  @PayloadRoot(localPart = GET_TIMESHEET_REQUEST, namespace = NAMESPACE)
  public ProductResponse getProducts(ProductRequest productRequest) {
    return null;
  } 
}
Geschrieben von
Thorsten Kamann
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.