Archive for the ‘Web Services’ Category

Beim „Contract First“ Ansatz für WebServices generiert man zuerst die WSDLs und dazugehörigen XML Schema-Dateien, um daraus dann mit WSDL2Java ein Java Bean Skeleton zu erzeugen.

Wenn dann die URL des WebServices mit ?wsdl aufgerufen wird, generiert AXIS aus den Klassen mit Java2WSDL wieder eine WSDL Datei.

Allerdings gibt es da ein Problem mit annonymen inneren ComplexTypes, wenn ein Element maxOccurs=“unbounded“ definiert ist.

Der XSD-Ausschnitt, der den Fehler:

Server.generalException – makeTypeElement() was told to create a type […]

generierte, sah folgendermaßen aus:

<complexType name=“searchItemListType“>
<sequence>
<element maxOccurs=“unbounded“ name=“searchItem“ />
<complexType> <– annonymous inner type
<sequence>
<element ref=“tns:id“/>
<element name=“name“ type=“string“/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>

D.h. also, der Typ für das searchItem-Element hat keine Bezeichnung. Und ich denke hier lag mein Denkfehler.

Wie soll WSDL2Java Klassen (also Typen) erstellen für Arrays ohne einen Namen zu haben.

Deshalb sieht die Lösung folgendermaßen aus:

<complexType name=“searchItemListType“>
<annotation>
<documentation>Type for all searchItems with id and itemtext in the selected language</documentation>
</annotation>
<sequence>
<element maxOccurs=“unbounded“ name=“searchItem“ type=“tns:searchItemType“/>
</sequence>
</complexType>

<complexType name=“searchItemType“>
<sequence>
<element ref=“tns:id“/>
<element name=“name“ type=“string“/>
</sequence>
</complexType>

So funktioniert nun auch Java2WSDL und zeigt die WSDL-Datei problemlos an.

Den Web Service habe ich heute fertig modelliert und ihn soweit gebracht, dass er mal ein paar Testdaten ausspuckt.

In der Web DynPro Anwendung wurde das Model über die WSDL-Definition importiert und die Mappings und Bindings über die GUI zusammengeklickt. Eine Zeile Code musste ich dort programmieren um folgendes Formular zu haben, welches seine Daten über den Web Service bezieht.

Schon erstaunlich wie „einfach“ das geht.

Morgen werde ich dann mal das bisher gelernte dokumentieren.

Zunächst braucht man eine gültige WSDL mit ordentlichen in XSD definierten Typen. Hieraus lässt man sich über den Create Model Assistenten ein Model erstellen. Dadurch wird ein sogenannter Service Proxy generiert, welche als Stellvertreter für den eigentlichen Web Service aufgerufen wird und selbst als Client agiert, so wie ich das verstanden habe. Dieses Model wird dann mit dem Controller Context der Komponente verbunden, um zentral über die Daten verfügen zu können.

Man kann dann relativ einfach ein Service Controller Template generieren lassen, welches in den wdDoInit() und execute() Methoden das Model initialisiert (die Web Service Aufrufe verwaltet).

Danach sollten man die View Controller Contexte auf den Component Controller Context mappen und das Data Bindung für die Views durchführen.

Nun noch die Event Handler anlegen und implementieren und fertig ist die Web Dynpro Anwendung, die ihre Daten komplett über einen Web Service bezieht.

Den Web Service selbst möchte ich gerne unter Tomcat laufen lassen, um die altbekannten Werkzeuge einsetzen zu können und zu testen, ob das alles ohne Probleme zusammen funktioniert.