# WebService mit komplexen Objekten



## Gelöschtes Mitglied 17093 (6. Aug 2009)

Hallo,
ich habe eine grundsätzliche Frage. Ich habe einen Web-Service erstellt, welcher komplexe Datentypen als Eingabeparameter bekommt, und auch komplexe Datentypen wieder zurückgibt. 
Diese Datentypen bestehen aus verschachtelten, von mir selbst erstellen Objekten. 
Wenn ich nun versuche den Web-Service zu deployen, erhalte ich eine IllegalArgumentException.

Ich habe jetzt ein wenig gegoogelt, und ab und an gelesen das sich komplexe Datentypen nur schwer über SOAP transportieren lassen, und jetzt weiss ich nicht weiter.
Gibt es möglichkeiten selbsterstellte komplexere Objektstruturen als Eingabe sowie Rückgabeparamter zu benutzen?
Ich hoffe ihr könnt mir helfen,

PS: Man muss dazu sagen, wenn ich beim Deployen die Methoden im Webservice auskommentiere, welche komplexe Datentypen beinhalten - kommt es zu keiner IllegalArgumentException, diese erscheint genau ab dem Moment, sobald verschachtelte Objekte benutzt werden sollten.

Vielen Dank im Vorraus,
Grüsse,
powerlinemk


----------



## musiKk (6. Aug 2009)

Steht noch irgendwelcher Text in der Exception?
Ansonsten dürfte das vom verwendeten Webservice-Framework abhängen. Bei JAX-WS wird JAXB verwendet, da könntest Du Dir von Hand ein XML Schema bauen, welches Deinen Anforderungen gerecht wird. In der WebService-Annotation kann man ein WSDL-Dokument angeben und dort kannst Du das Schema referenzieren. Vielleicht gehts auch einfacher, aber sonst ist mir nichts bekannt...


----------



## Gelöschtes Mitglied 17093 (14. Aug 2009)

Hallo,
die Fehlermeldung sieht so aus :

Exception in thread "main" java.lang.IllegalArgumentException: argument contains null
at com.sun.xml.internal.txw2.Document.writeValue(Document.java:125)
at com.sun.xml.internal.txw2.Document.writeValue(Document.java:129)
at com.sun.xml.internal.txw2.StartTag.addAttribute(StartTag.java:115)
at com.sun.xml.internal.txw2.ContainerElement._attribute(ContainerElement.java:298)
at com.sun.xml.internal.txw2.ContainerElement.addAttribute(ContainerElement.java:155)
at com.sun.xml.internal.txw2.ContainerElement.invoke(ContainerElement.java:129)
at $Proxy68.type(Unknown Source)
at com.sun.xml.internal.ws.wsdl.writer.WSDLGenerator.generateSOAPMessages(WSDLGenerator.java:432)
at com.sun.xml.internal.ws.wsdl.writer.WSDLGenerator.generateMessages(WSDLGenerator.java:400)
at com.sun.xml.internal.ws.wsdl.writer.WSDLGenerator.generateDocument(WSDLGenerator.java:366)
at com.sun.xml.internal.ws.wsdl.writer.WSDLGenerator.doGeneration(WSDLGenerator.java:262)
at com.sun.xml.internal.ws.server.EndpointFactory.generateWSDL(EndpointFactory.java:413)
at com.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:182)
at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:420)
at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:439)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:208)
at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:138)
at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:92)
at javax.xml.ws.Endpoint.publish(Endpoint.java:170)
at epa2.WebService.StartWebService.main(StartWebService.java:13)

Dann würde ich noch gerne wissen, wie das mit dem Referenzieren genau funktionieren soll? Gibt es da vielleicht ein Tutorial oder ähnliches?
Vielen Dank im Vorraus,
Grüsse,
powerline


----------



## musiKk (14. Aug 2009)

Hm. Jemand, der damit mehr Erfahrung hat, kann dazu sicher schon was sagen. Ich bräuchte wohl etwas Code; z. B. wie die komplexe Datenstruktur aussieht, mit der der Deploy fehlschlägt.


----------



## romzac (15. Aug 2009)

Tja, das mit den komplexen Datenstruktturen ist so eine Sache.
Ich hatte damit auch einige Probs in meiner Diplomarbeit, bis ich mir das Buch "Java Web Services mit Apache Axis 2" zugelegt habe. In Kapitel 3 wird sowohl der automatische als auch manuelle Zugriff auf komplexe Strukturen beschrieben.
Daraus geht hervor, dass die ganzen Datenstrukturen zum Übertragen alle in einfache Strings serialisiert werden um sie in einer SAOP Message zu verpacken, und auf der Empfängerseite wieder deserialisert werden. Praktischerweise gibt es in der Axis API aber einige BeanUtil-Funktionen dafür.
Dieses Konzept setzt auch voraus, dass schon eine Stub von den Klassen, die transportiert werden sollen, auf der Empfänger & Sender Seite existieren. Dort wird jeweils dann ein neues lokales Objekt instanziert, dass nur mit den Attributen aus der geparsten SAOP Nachricht gefüllt wird. ich ahbe damals die Plugins von der Axis2 Seite für Eclipse verwendet, die beim Deployen der Web Anwendung auch einen Service Client mit erstellen, worin auch - wie mein Vorgänger schon sagt - die XML Beschreibung für die Datenstruktur enthalten ist.

Wenn noch interesse besteht, kann ich evtl. bis morgen abend mal in meine alten Trial&Error-Codes rein gucken. irgendso ein paar Beispiele aus dem Buch hatte ich glaube ich abgeschrieben, weiss abe rnciht ob ich die widerfinde, weil ich vor 6 Monaten den Rechner neu aufgesetzt habe...


----------



## raphaa (27. Aug 2009)

Hi,
bezüglich des Themas passt, glaube ich, meine Anfrage auch hier rein. Ich habe einen WebService zur kontrollierten und automatischen Softwareverteilung gebaut, muss jetzt aber noch die SoftwareUpdate (in Form eines JARs) auf den Weg zum Client schicken. Hat jemand eine Idee wie? Die Daten sind auf jeden Fall binär zu übertragen. Welchen Datantyp benutzt man für eine Übertragung von Binärdaten? Müssen die Codiert/Decodiert werden?
Gruß


----------

