AXIS2 Webservice: Umgang mit komplexen Datentypen

sunnyheinz

Mitglied
Hallo zusammen,

ich erstelle gerade einige Webservices mit AXIS2 und dem ECLIPSE WTP Plugin (Axis2 V1.4 und ECLIPSE GANYMEDE). Das klappt soweit ganz gut, aber ich habe noch ein Verständisproblem bzgl. der Behandlung nichtprimitiver Datentypen, das ich über google nicht klären konnte (vermutlich in Ermangelung des passenden Suchwortes :()

Meine Webservice Klasse sieht wie folgt aus:
Java:
package com.sh.test;

import java.util.UUID;

public class Webservice {
	public enum Meinenum {EINS, ZWEI, DREI}
	
	public Meinenum test(UUID uuid) {
		System.out.println("Aufruf mit UUID: " + uuid.toString());
		return(Meinenum.EINS);
	}
}

Ok, ist sinnfrei, soll aber auch nur ein Test sein. Ich kann aus dieser Klasse mittels WTP einen Webservice bauen und deployen und auch einen WebserviceStub für den Client generieren.

Problem:
Der Stub definiert eine eigene UUID Klasse WebserviceStub.UUID, die dann für das Requestobjekt verwendet werden muss. Ein cast des UUID Objektes aus java.util wird nicht akzeptiert.
Zudem ist der Rückgabewert der get_return() Methode des Responseobjektes auch nicht vom Typ Meinenum, sondern vom Typ Webservice_Meinenum und lässt sich einer Variablen vom Typ Meinenum auch nicht zuweisen.

Wenn ich einen int als Rückgabewert und einen String als Übergabeparameter definiere, funktioniert freilich alles, aber ich würde gerne verstehen, wie man mit komplexeren Datentypen richtig umgeht.
 

mvitz

Top Contributor
In Verbindung mit Metro (JAX-WS Implementierung) habe ich dafür eine Möglichkeit gefunden, dieses Problem zu lösen, zu Axis/Axis2 ist mir (außer den Client NICHT zu generieren und die Axis2 API zu nutzen) keine Möglichkeit bekannt.

Die wohl sinnvollste Lösung ist es, die Aufrufe deines WS-Clients in einer Methode zu kapseln, die Argumente und Rückgabewerte umwandelt.

Hilfreich für komplexere Objekte ist dabei: BeanUtils (Commons BeanUtils 1.8.3 API)
 

fastjack

Top Contributor
Ich habe schon vor ca. zwei Jahren komplexe Datentypen mit Java-Webservices (Axis) verwendet. Java<->Java und Java<->.net kein Problem. Probleme gab es allerdings mit Listen von komplexen Datentypen, wenn es sich um einen .net <3.5 Client handelte. .net hatte den Code immer so generiert, das Rückgaben und Anfragen mit Listen immer null sendeten/empfingen. Dort mußte manuell der .net Code angepaßt werden, dann lief es.
 

fastjack

Top Contributor
Zum Problem: Wenn in aus Deiner WSDL ein Webservice_MeinEnum generiert wird, mußt Du das auch in der Software in irgendeiner Form verwenden.
 

sunnyheinz

Mitglied
Danke für Eure Rückmeldungen!

Aktuell wandle ich die zu übertragenden Objekte mittels xstream in einen XML String, übertrage diesen und wandle auf der Clientseite mit xstream wieder zurück in das Ausgangsobjekt. Das funktioniert zwar, kommt mir aber umständlich vor, denn diese Konvertierung hätte ich eigentlich vom Axis2 Framework erwartet.

Ich schaue mir mal an, was Axis2 aus meinen Objekten bei der Übertragung macht. Vielleicht komme ich ja ohne xstream aus und kann auf der Clientseite das Ursprungsobjekt aus den Stub-Eigenen Klassen wieder entnehmen und ein Objekt der Originalklasse zuammenbauen.

Kann ich Axis2 nicht irgendwie sagen, wie ein custom-Typ serialisiert und deserialisiert werden soll, so dass auf der Clientseite gleich der richtige Objekttyp erzeugt wird?
 

sunnyheinz

Mitglied
Mal ein Zwischenstand zu meinem Problem: Habe jetzt zu allen Businessobjekten und den davon referenzierten Objekten, die als Parameter oder Rückgabewert verwendet werden, vereinfachte "Transportobjekte" erstellt. Diese Transportobjekte enthalten nur primitive Datentypen oder sie referenzieren weitere Transportobjekte.

Für jedes Paar Businessobjekt/Transportobjekt habe ich Konverter erstellt, die vor und zurück konvertieren können.
Auf der Serverseite verwende ich nun diese Transportobjekte, wandele sie in Businessobjekte, arbeite mit den Businessobjekten und wandele anschließend den Rückgabewert wieder in ein Transportobjekt. Das funktioniert soweit, wenn es auch umständlich ist.

Mit diesen Transportobjekten als Schnittstellenparameter und Rückgabewerte habe ich dann den Webservice generiert.

Anschließend habe ich dann den Client generiert. Dabei wurde für jedes Transportobjekt ein zusätzliches Objekt mit gleichem Namen erzeugt, das im Client Stub definiert wird(!). Damit musste ich dann zusätzliche Konvertierungsroutinen schreiben, die dann von diesen Client-Transportobjekten in Businessobjekte und zurück wandeln.

Der gesamte Weg ist also jetzt wie folgt:

- Client will Businessobjekt übertragen
- Client wandelt Businessobjekt und alle referenzierten Objekte in Client-Transportobjekte
- Client überträgt Client-Transportobjekte an Server
- Beim Server kommen Transportobjekte an (nicht Client-Transportobjekte!)
- Server wandelt Transportobjekte in Businessobjekte
- Server arbeitet mit Businessobjekten
- Server wandelt Businessobjekte in Transportobjekte (nicht Client-Transportobjekte!)
- Server verschickt Transportobjekte als Response
- Beim Client kommen Client-Transportobjekte an
- Client wandelt Client-Transportobjekte in Businessobjekte

Also eine üble Konvertierungsorgie. Wenn ich jetzt ein Attribut im Businessobjekt ändere, muss ich alle Transportobjekte und mehrere Konvertierungsroutinen anpassen.

Scheint mir noch nicht ganz die optimale Lösung zu sein... ;(
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L [AXIS2] OutOfMemory Exception bei Übertragung von größerer Datei via Webservice SOA 3
T Verwendung von Eclipse Projekten im Axis2 Webservice SOA 8
S Axis2 Dateien lesen und schreiben - Pfade SOA 1
C SSL in Tomcat mit Axis2 SOA 4
K Axis2 SOAP Logging via Client SOA 2
S Axis2 Fault - Wie im Client auslesen? SOA 6
S Axis2 / Rampart - XML-Datei verschlüsseln & versenden SOA 14
J Axis2 und wiederverwenden der Serverobjekte SOA 3
B Axis2 Cipher Suite und Protocol einschränken SOA 2
H Axis2 dynamische URL zu WSDL SOA 2
H Axis2: XML<->DB SOA 2
T Axis2 Problem: leeres Array? SOA 1
S Axis2 MustUnderstand problem mit Boolean SOA 9
F Axis2 große Strings streamen SOA 3
A Axis2 oder 1 Ntlm Authentification SOA 5
J Axis2 und Tomcat SOA 4
T Hat AXIS2 noch Zukunft und wie REST implementieren? SOA 6
R AXIS2 u. Eclipse (Galileo) Fehler bei Serverstart SOA 2
G Stub generieren (WSDL=Axis1.4) (WSDL2JAVA=Axis2) SOA 11
H Axis2 Deployment SOA 5
R SOAP Nachrichtenaustausch zwischen Axis2-WSs SOA 5
S Exception in axis2 java2wsdl ant Task SOA 1
N Request-XML-String -> AXIS2 -> WSDL-Check -> Respon SOA 2
G Axis2 Properties SOA 6
N Axis2: Binärdateien übertragen mit JWS/RPC SOA 2
M Axis2 vs XFire vs JAX-WS SOA 4
N Axis2 - hibernate.cfg.xml - wohin? SOA 6
K Axis2 Service / deploying to Tomcat 5.5.25 / web.xml SOA 5
F Axis2 und Listen SOA 3
I Axis2 mit SSL verschlüsseln SOA 4
N Axis2 - Cliententwicklung SOA 3
G axis2 rampart 1.3 SOA 1
K Webservices mit Axis2 SOA 2
T Error beim Versuch, einen Webservice zu kontaktieren SOA 4
J SOA WebService JAX-WS Java-Klasse per wsimport generieren lassen SOA 3
K Webservice: 4 counts of IllegalAnnotationExceptions SOA 0
D Zertifikat Authentifizierung am Webservice SOA 0
P JBOSS 7 und Restful Webservice SOA 1
N WebService Ausgabe einer ArrayList SOA 2
N Web Services Client aus externen WebService erstellen SOA 4
I SOAP Webservice Methoden und Parameter auslesen SOA 3
F [WebService] Array von eigenen Objekten SOA 0
P SOAP Webservice mit HTTP Basic Authentifizierung SOA 1
M JAVA Webservice Währungsrechner DRINGEND Hilfe SOA 1
A Up-/ Download von Dateien zu WebService SOA 6
D WebService Technik - Aufwand Änderung des Application Server SOA 3
R Webservice Timeout Konfiguration SOA 3
D SOAP Webservice (SAP) SOA 3
MQue WebService Versionierung SOA 9
A Funktion mit Map als WebService SOA 4
T Webservice serviceName im Handler ermitteln SOA 3
N Webservice Einbinden wsdl SOA 7
M Edit und Remove über Webservice SOA 3
F Client Problem gegen Webservice SOA 3
P Java Webservice mit JWS Bindingnamen customizen SOA 4
L wie ArrayList an Webservice geben? SOA 3
B Webservice Config / SoapStub: Best Practice SOA 3
S Objektübertragung Fehler über Webservice SOA 10
E Webservice durch Java ansprechen SOA 7
L Webservice HTTPS Netbeans SOA 2
G NullPointerException bei Parameterübergabe an Webservice mittels kSoap2 SOA 2
M Webservice per URL ansprechen SOA 14
M Webservice Client erstellen und XML Request senden SOA 3
S Webservice als "CronJob" SOA 4
M Webservice (JaxWS) extern verfügbar machen SOA 5
M Welches WebService Framework ist denn das beste FRAMEWORK? SOA 5
D Webservice fürs Internet sichtbar machen SOA 2
W WebService aus einer HTML-Seite SOA 9
T WebService innerhalb von Seam-Projekt, komplexe Datentypen SOA 6
N JAX-WS WebService und Tomcat 7 SOA 11
E Trennung von Daten und WebService und Wiederverwendung der Daten SOA 2
D Sicherheit bei REST-Webservice SOA 19
G WebService, was darf der Client alles sehen SOA 19
M Nutzen des Webservice AWSECommerceService SOA 1
G Webservice Contract first SOA 8
G WebService -> ServletFilter SOA 2
G WebService Concurrency SOA 19
M Fehler beim Veröffentlichen eines Webservice SOA 6
G WebService Types SOA 7
G OpenLigaDB Webservice Client SOA 4
G WebService WSDL SOA 3
A PHP WebService aus Java aufrufen SOA 2
R Proxy WebService erstellen SOA 3
G JPA/ Webservice: Passwort Feld einer Klasse fürs Lesen "verschleiern" SOA 10
G WebService mit wsdl erstellen SOA 4
P WebService SOA 6
H Webservice: BindingProvider SOA 6
D WebService DB abfrage SOA 4
mabe83 EJB Klassen für Webservice nutzen SOA 2
S Webservice-Client-Klasse gibt immer null zurück SOA 3
G WebService mit komplexen Objekten SOA 5
C Problem mit Java Webservice - SOAPBinding.Style - Wrapper class fehlt SOA 1
T Rest Webservice der 2 verschiedene XML Objekte(JaxB) entgegennimmt SOA 10
S Webservice, Vererbung und Netbeans SOA 3
E Lesen der kompletten SOAP als WebService Provider/Server SOA 4
T WebService Authentifizierung SOA 11
mabe83 Suche Hilfe zum Thema Webservice + EJB SOA 3
T WebService erstellen SOA 28
T Krankes Vorhaben: Von VB auf Java Webservice SOA 10
M Webservice RuntimeModelerException? SOA 5

Ähnliche Java Themen

Neue Themen


Oben