# WSDL Java C#



## Generic1 (23. Dez 2011)

Hallo,

ich habe eine WSDL vorliegen (die Applikation dahinter wurde mit C# programmiert) und möchte mit einem Java- Client darauf zugreifen. 
Weiß jemand ob das so ohne weiteres funktioniert.
Die von der WSDL angebotenen Methoden liefern teilweise nicht nur primitive Datentypen zurück sondern auch Objekte -> und da liegen meine Bedenken.

Einen "normalen" Java- Client zu machen, das ist mir klar wie das geht, einfach Eclipse anwerfen, Wizard durchklicken und fertig, das dürfte nicht das Problem sein und hab ich auch schon einige male gemacht aber wie ist es eben mit den return Objekten?

lg


----------



## schlingel (23. Dez 2011)

Genauso. Die werden ja auch im WSDL definiert. Probier es also einfach aus.


----------



## bronks (24. Dez 2011)

Generic1 hat gesagt.:


> ... aber wie ist es eben mit den return Objekten? ...


Return ist nicht so das Problem, aber freu Dich, wenn es ein Ouput Parameter ist. Sun bzw. Oracle wollte das schon 2004 in zukünftigen Javaversionen nicht unterstützten.


----------



## DerFeivel (26. Dez 2011)

Die in der WSDL definierten Objekte setzen sich ja wiederum auch nur aus primitiven Typen zusammen. 
Dementsprechend werden einem dann mit wsimport (den Wizard hab ich leider nie benutzt) mit die entsprechenden JaxB-Klassen erzeugt.


----------



## fastjack (26. Dez 2011)

Wir hatten bei Listen von Objekten damals erhebliche Schwierigkeiten unter .net. Die Kombination war Java/Tomcat/Axis -> WSDL -> 3.3/3.4 .net Client. Der .net Codegenerator hat Objektlisten schrott generiert, sodaß der Client immer Null empfangen hat.


----------



## Pippl (27. Dez 2011)

Antwort: JA, es geht ohne Probleme (vl wenn mans das erste mal macht hier und da ein paar Ecken, aber naja gibts ja immer)

Wir haben in der Firma unser Framework für Client/Server Anwendungen von Java auf C# konvertiert - mit Sharpen - (um beides anbieten zu können). Aber für automatische Tests bzw. Lasttest verwenden wir noch das Test-Framework welches in Java geschrieben ist. Da funktioniert die Kommunikation mit dem C# Service ohne Probleme (mehrere komplexe Objekte werden verschickt).


----------



## Generic1 (29. Dez 2011)

Besten Dank für die Antworten, jetzt hätte ich noch eine Frage.
Ich hab mir jetzt den WS- Client mit Netbeans (JAX-WS) erzeugt - der Code wurde generiert ohne Fehler. 
Mit SOAP UI kann ich auf den WS einwandfrei zugreifen.
Ich weiß jetzt aber nicht, wie ich mich programmatisch mit dem WS im WS- Client verbinde. 
Gaming heißt der WS und daher gibt es auch eine Java- Klasse "Gaming". Ich bin jetzt mal hergegangen und hab ein Objekt von Gaming erzeugt und wollte dann create aufrufen. aber create verlangt ein QName Objekt und ich hab keine Ahung was da verlangt wird:

```
Gaming g = new Gaming();
QName qName = new QName("da soll irgend ein String hergehören, k.a. welcher");
g.create(qName);
```

Meine Frage wäre wie mal bei einem Zugriff auf einen WS am WS- Client vorgeht bzw. kennt jemand ein Tut wo das drinnsteht wie das mit Netbeans geht. 

Das müsste ja so passen, dass ich einfach ein Objekt vom WS mache, dann create aufrufe, oder? 
Was mich ein bisschen stutzig macht ist, dass es ausser den createMethoden und getServicePort() keine Methoden in Gaming gibt, dafür gibt es andere Java- Klassen, in denen dann die Methoden des WS enthalten sind. 

Vielleicht kann mir jemand auf die Sprünge helfen.
Vielen Dank,


----------



## bronks (29. Dez 2011)

Generic1 hat gesagt.:


> ... Vielleicht kann mir jemand auf die Sprünge helfen. Vielen Dank,


Das sollte helfen: 


```
...
DemoCSServiceLocator loc = new DemoCSServiceLocator();
DemoCSServiceSoap port = loc.getDemoCSServiceSoap();
System.out.println(port.sayHello("JavaApp"));
...
```


----------



## DerFeivel (29. Dez 2011)

Create ist eine Methode der Klasse Service von der dein Client erbt.

Diese dient dazu Services entsprechend einer WSDL-Location und eines Servicenamens zu erzeugen.
Diese Funktionalität wird aber bereits durch deine Klasse "Gaming" bereitgestellt, welche dir eine Instanz eines Services mit den in der WSDL hinterlegten Daten erzeugt.
(wenn du dir die Klasse ansiehst, wirst du im Konstruktor von Gaming einen Aufruf a la:"super(wsdlLocation,serviceName)" sehen)




Um jetzt eine Funktion deines Webservices aufrufen, muss dein Programm aber nicht nur wissen WO (=wsdlLocation) der Service liegt und WIE(=serviceName) er heisst.
Er muss zusätzlich wissen, welches Protokoll er für den Aufruf verwenden soll. Gegeben durch das Binding, welches über die in der WSDL hinterlegten Ports zur definiert sind.

Auf diesem Port (Ort,Name,Protokoll sind jetzt bekannt) kannst du dann die Methode deines Webserivces aufrufen. 

Ist zwar sachlich jetzt nicht 100% richtig. Aber ich hoffe es wird zumindest klar, was dir gerade noch fehlt.

Beispiel:

Gaming gamingServiceProxy = new Gaming();   // <--Service-Proxy...wo liegt der Service und wie heisst er
GamingService gamingServicePort = gamingServiceProxy.getGamingSOAP();  // <--SOAP-Port...benutzer das SOAPProtokoll für die Anfrage
DoSomethingResponseObject response = gamingServicePort.doSomething(); // <--Methode deines Webservices...Eine Anfrage für die Webservice-Methode DoSomething wird jetzt also mit dem SOAPBinding an die "Standard-URL" des Webservices gesendet


Wenn ich nachher noch Zeit habe, schreib ichs vielleicht nochmal ausführlicher.


----------

