Enterprise/Web Services mit Spring WS

Web Services mit Spring WS und JAXB

Thorsten Kamann

Zusätzlich zu den Annotations ist bereits der ProductService injiziert worden. Das ist mit der Autowired-Annotation realisiert. Hier versucht Spring anhand des Typs das passende Objekt zu injizieren. Jetzt fehlt nur noch die Implementierung des Endpoints.

Listing 7
@PayloadRoot(localPart = GET_TIMESHEET_REQUEST, namespace = NAMESPACE)
public ProductResponse getProducts(ProductRequest productRequest) {
  Category category = new Category();
  CategoryType categoryType = productRequest.getCategory();

  category.setId(categoryType.getId());
  category.setName(categoryType.getName());

  Supplier supplier = new Supplier();
  SupplierType supplierType = productRequest.getSupplier();

  supplier.setId(supplierType.getId());
  supplier.setName(supplierType.getName());

  DateRange dateRange = new DateRange();
  DateRangeType dateRangeType = productRequest.getDateRange();

  dateRange.setStartDate(dateRangeType.getStartDate());    dateRange.setEnddate(dateRangeType.getEndDate());
  .
}

Dazu müssen wir zuerst unser Domänenmodell (Abb. 4) mit den Daten des Requests füllen (Listing 7). Das erreichen wir, indem wir aus dem ProductRequest die Objekte extrahieren, die wir aus dem XML Schema generiert haben. Diese Objekte verwenden wir, um die Daten auszulesen und in unser Domänenmodell einzutragen. Jetzt kann die Find-Methode des ProductService abgefragt werden. Das Ergebnis – eine Liste mit zwei Produkten – wird in den Response umgewandelt (Listing 8).

Listing 8
@PayloadRoot(localPart = GET_TIMESHEET_REQUEST, namespace = NAMESPACE)
public ProductResponse getProducts(ProductRequest productRequest) {
  .
  ProductResponse productResponse = new ProductResponse();
  List products = 
    productService.findProductsForSupplierAndCategoryInDateRange(
      category, supplier, dateRange);

  for (Product product : products) {
    category = product.getCategory();
    supplier = product.getSupplier();
      
    ProductResponse.Product p = new ProductResponse.Product();
    p.setId(product.getId());
    p.setName(product.getName());
    p.setCategory(new CategoryType().withId(
      category.getId()).withName(category.getName()));
    p.setSupplier(new SupplierType().withId(
      supplier.getId()).withName(supplier.getName()));
    productResponse.getProduct().add(p);
  }
  return productResponse;

}
Die Spring-Konfiguration

Die Implementierung des Endpoints ist beendet. Jetzt fehlt noch etwas Konfiguration, um die einzelnen Komponenten miteinander zu verdrahten. Dank der Annotations ist die Konfiguration jetzt sehr übersichtlich. Damit die Spring-Beans – in unserem Fall sind es zwei, nämlich der ProductService und der Endpoint – automatisch miteinander verdrahtet werden können, muss der Komponentenscan aktiviert werden (Listing 9). Mit dieser Konfiguration werden alle Klassen in dem angegebenen Package analysiert, und falls eine der Spring-Annotations (z. B. @Service, @Component) gefunden wird, werden die Beans miteinander verdrahtet. In unserem Fall sorgt diese Konfiguration dafür, dass im Endpoint der ProductService verfügbar ist.

Listing 9

Wie in Teil 1, soll die WSDL automatisch generiert werden. Dazu brauchen wir die Konfiguration aus Listing 10. Die WSDL wird von Spring WS zur Laufzeit generiert und ist unter http://SERVER/ANWENDUNG/productService/product.wsdl verfügbar.

Listing 10

  .
  

Der letzte Teil der Konfiguration, der in Listing 11 abgedruckt ist, konfiguriert den Annotation-Support für den Endpoint und den zugehörigen Marshaller. Durch die Endpoint-Annotation brauchen wir uns um das (Un-)Marshalling nicht mehr zu kümmern.

Listing 11
Geschrieben von
Thorsten Kamann
Kommentare

Schreibe einen Kommentar

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