# WebService portieren



## Generic1 (9. Sep 2010)

Hallo,

ich hab jetzt auf meinem Rechner einen WebService programmiert (bzw. ein Dynamic Web Projekt mit Eclipse programmiert, welches einen WebService enthält).
Jetzt möchte ich diese Web- Applikation auf einen anderen Rechner laufen lassen.

Dazu muss ich eigentlich die ganze Web Applikation auf dem neuen Rechner neu kompilieren da ja im WebService (in der WSDL) folgendes stehen hab: 

<service name="ServiceName">
      <port name="MyPort" binding="tns:irgendwas">
         <soap:address location="http://IPort/my/Path/to/the/Webservice" />
      </port>
</service>

gibts da eine andere Möglichkeit wie man das machen kann?
lg


----------



## JohannisderKaeufer (9. Sep 2010)

Webservice ist ja ein Server.

Der braucht ja prinzipiell garnicht wissen wo er läuft. Er läuft einfach.


Der Client braucht aber die Information wo er den Service findet.
Wenn Client und Server auf dem gleichen Rechner laufen, kann das ganze auch über den localhost laufen.

Je nach implementierung des clients kann man auch die Adresse zur Laufzeit aus einem wsdl Dokument auslesen lassen.

Zudem gibt es auch noch die Möglichkeit sich die WSDL zur Laufzeit generieren zu lassen.


----------



## Generic1 (9. Sep 2010)

Mir ist nicht ganz klar, was du mir dagen willst,

ich muss die Web Applikation mit dem WebService ja mal programmieren auf meinem Rechner, der nicht der Server ist.
Wenn ich diese Web Applikation dann auf dem Server portieren will, dann hat der Server grundsätzlich mal eine andere IP als der Rechner, auf dem ich die Web Applikation mit dem WebSerice programmiert habe. 
Eine dynamische Erzeugung von der WSDL ist bei mir nicht vorgesehen.

Meine Frage wäre jetzt gewesen, muss ich am Server Eclipse installieren um für den Server eine *.EAR mit der richtigen IP- Adresse (die des Servers) zu erzeugen oder gibt es eine einfachere Möglichkeit bzw. wie macht ihr das -> programmiert ihr auf dem lokalen/aktuellen Rechner in bezug auf den Server (also mittels Eingabe der Server IP)?

Oder noch anders gefragt, wenn Ihr die *.EAR vorliegen habt, in der ja die WSDL vorhanden ist, in der die IP drinnensteht -> was macht ihr, wenn sich die IP des Servers (kommt eh selten vor aber im Fall der Fälle) ändert -> dann funktioniert ja der WebService nicht mehr!?


----------



## JohannisderKaeufer (10. Sep 2010)

Einmal ein recht minimaler Webservice der mit Entpoint veröffentlicht wurde.

```
package test;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;

@WebService
public class AddService {

    @WebMethod
public int add(int a, int b){
    return a+b;
}
    public static void main(String[] args ){
        Endpoint.publish("http://0.0.0.0:1234/AddService", new AddService());
    }
}
```

Die wsdl unter http://localhost:1234/AddService?wsdl aufgerufen
[XML]<service name="AddServiceService">
<port name="AddServicePort" binding="tns:AddServicePortBinding">
<soap:address location="http://localhost:1234/AddService"/>
</port>
</service>[/XML]

Die wsdl unter http://192.168.0.133/AddService?wsdl aufgerufen
[XML]<service name="AddServiceService">
<port name="AddServicePort" binding="tns:AddServicePortBinding">
<soap:address location="http://192.168.0.133:1234/AddService"/>
</port>
</service>[/XML]

Dem Webservice ist prinzipiell egal unter welcher IP er zu finden ist. 

Lasse ich das ganze unter nem Tomcat mit Jax-Ws laufen bekomme ich das selbe Ergebnis. Die URL unter der ich die WSDL aufrufe, wird als soap:address location gesetzt.
[XML]<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>
<endpoint name="AddService" implementation="test.AddService" url-pattern="/AddService"/>
</endpoints>[/XML]

[XML]<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

    <listener>
    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>


  <servlet>
  <display-name>AddService</display-name>
  <servlet-name>AddService</servlet-name>
  <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  <servlet-name>AddService</servlet-name>
  <url-pattern>/AddService</url-pattern>
  </servlet-mapping>


</web-app>
[/XML]

Wie du siehst habe ich nirgends eine IP angegeben. Lediglich die 0.0.0.0 im ersten Beispiel.


----------



## Generic1 (30. Sep 2010)

Versteh ich ehrlich gesagt jetzt nicht ganz, wenn ich eine WSDL habe, wo folgendes drinnen steht als port:


```
<service name="MyService">
      <port binding="tns:MyServicePortBinding" name="MyServicePort">
         <soap:address location="http://10.23.12.222:8080/services/MyServicePort"/>
      </port>
   </service>
```

Dann hab ich anhand des Top- Down- Verfahrens die Java- Klassen anhand der WSDL generieren lassen.
Danach hat der WEbService ab dem Rechner 10.23.12.222 funktioniert.

Nun ist das aber der Rechner, wo ich entwickle, der WebService soll aber auf einem anderen Rechner/Server laufen.
Meine Frage wäre jetzt, wie ich das mache. 
Muss ich mir da auf dem Rechner/Server, wo dann der WebService laufen soll, Eclipse installieren, ein Dynamic Web Projekt anlegen, die WSDL in das Projekt geben und dann wieder die Java- Klassen anhand der WebService Top- Down methode erzeugen lassen oder gibt es eine Möglichkeit, dann ich den auf dem EntwicklungsRechner entwickelten WebService einfach auf den Server portieren kann?

Vielen Dank,
lg


----------



## Generic1 (30. Sep 2010)

Also bleibt doch nichts anderes übrig, als am Server das Ganze wieder zu machen wie auf dem Entwicklungsrechner!?


----------



## mvitz (30. Sep 2010)

Du kannst den aus der WSDL generierten Klassen doch die Server URL übergeben.


----------



## Generic1 (30. Sep 2010)

Das versteh ich jetzt nicht ganz, könntest du das näher erklären. 
Ich hab den Port (also die URL) ja nur in der WSDL stehen!? 
Was müsste ich machen, wenn ich das ganze Dynamic WEb Projekt auf einen anderen Rechner portiere?
lg


----------



## fastjack (30. Sep 2010)

Du kannst in die WSDL immer die richtige Adresse eintragen, wenn Du in deinem Testbetrieb (Testclients etc.) den Endpoint programmatisch mit einer Methode des Service-Objekts setEndpoint(...) änderst. Dann deployst Du sozusagen immer die richtige Adresse.


----------



## mvitz (30. Sep 2010)

Nur nochmal für das Verständnis, es gibt für WebServices zwei Seiten, Server und Client und man kann nach den Ansätzen Code- oder Contract-First vorgehen.

Von welcher Seite und welchem Ansatz sprechen wir hier genau?

Angenommen du redest von beiden Seiten und dem Code-First Ansatz, dann sollte es folgendermaßen gehen:

1) Du erstellst deine WebService Klasse, annotierst sie und deployst sie. (siehe Post von JohannisDerKaeufer)

Die WSDL wird nun bei jedem Aufruf dynamisch erstellt und aus diesem Grunde passen sich die Angaben die du gepostest hast automatisch an den Server an --> hier musst du nichts beachten, einfach den Server auf einem neuen Rechner deployen.

2) Du erstellst den Client indem du dir Klassen aus der WSDL generierst.
Bei diesen generierten Klassen gibt es ja eine Einstiegsklasse "ServiceNameService", die du folgendermaßen nutzen solltest:

```
ServiceName service = new ServiceNameService().getPort(ServiceNameService.class);
```
Hierbei kann der Konstruktor der Klasse ServiceNameService eine URL als Parameter enthalten. Wenn diese gesetzt wird, wird zur Laufzeit praktisch die dort spezifizierte WSDL genutzt. Setzt du die URL nicht, dann wird deine Angabe aus der WSDL genutzt, aus der du die Klassen generierst hast.

Hoffe das hilft.


----------



## Generic1 (1. Okt 2010)

Also ich habe von Contract First (also die WSDL hab ich schon) geschrieben, wo der Code anhand einer vorhandenen WSDL am Server generiert werden soll. 
Client ist wieder eine andere Sache, die für mich in diesem Zusammenhang nicht wichtig ist.

Also, ich hab auf meinem Entwicklungsrechner in einem Dynamic Web Projekt eine WSDL, in der der Port drinnensteht (IP Adresse vom Entwicklungsrechner + Pfad)

Ich erstelle dann Anhand der WSDL den Code.
Wenn ich jetzt das Projekt / den Code nehme und auf einem anderen Rechner (Server) gebe, dann stimmt ja der Code nicht mehr (Server hat andere IP usw.)

Meine Frage wäre jetzt gewesen, wie kann ich das machen, damit ich das DWP auch auf einem anderen Rechner laufen lassen kann und der WS dann trotzdem noch von den Clients erreichbar ist?

Eine Möglichkeit wäre meiner Meinung nach, in der WSDL 2 Ports reinzuschreiben (die vom Entwicklungsrechner und die vom Server, wo der WS- Server dann laufen soll).
So in der Art: 


```
<service name="MyService1">
      <port binding="tns:MyServicePortBinding" name="MyServicePort1">
         <soap:address location="http://10.23.12.222:8080/services/MyServicePort"/>
      </port>
   </service>
<service name="MyService2">
      <port binding="tns:MyServicePortBinding" name="MyServicePort2">
         <soap:address location="http://192.168.12.222:8080/services/MyServicePort"/>
      </port>
   </service>
```

Ist das möglich?
lg


----------



## mvitz (2. Okt 2010)

Du kannst die Klassen auch ohne die Angabe generieren.

Also du hast eine WSDL, generierst dir daraus die Klassen, passt die Serviceklasse an deine Funktionalität an und möchtest dann diese Klassen als WebService auf einem Server betreiben, richtig?

Dann müssen die Clients einfach nicht die WSDL nutzen, aus der du generierst, sondern die, die dir JAX-WS zur Laufzeit generiert.

Die genau URL kann ich dir jetzt nicht nennen, aber idr. sieht diese so aus:

http://ip:port/context/servlet-mapping/service-name?wsdl


----------

