# Webservice definieren und andere Webservice aufrufen



## Taramsis (18. Aug 2010)

Hi Leute,

ich arbeite mich gerade in die Webservice Thematik aus Java heraus ein und habe anhand eines Tutorials einen Webservice geschrieben der addieren kann. 


> WebService in Java


Gibt es eine Möglichkeit die wsdl selbst zu definieren, da ich dies niergendwo entnehemen kann?

Diese beiden klassen wurden mir nach der eingabe von:



> wsimport -keep http://localhost:8080/calculator?wsdl



erstellt:



```
package service;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.6 in JDK 6
 * Generated source version: 2.1
 * 
 */
@WebServiceClient(name = "CalculatorService", targetNamespace = "http://javawebsertest/", wsdlLocation = "http://localhost:8080/calculator?wsdl")
public class CalculatorService
    extends Service
{

    private final static URL CALCULATORSERVICE_WSDL_LOCATION;
    private final static Logger logger = Logger.getLogger(service.CalculatorService.class.getName());

    static {
        URL url = null;
        try {
            URL baseUrl;
            baseUrl = service.CalculatorService.class.getResource(".");
            url = new URL(baseUrl, "http://localhost:8080/calculator?wsdl");
        } catch (MalformedURLException e) {
            logger.warning("Failed to create URL for the wsdl Location: 'http://localhost:8080/calculator?wsdl', retrying as a local file");
            logger.warning(e.getMessage());
        }
        CALCULATORSERVICE_WSDL_LOCATION = url;
    }

    public CalculatorService(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public CalculatorService() {
        super(CALCULATORSERVICE_WSDL_LOCATION, new QName("http://javawebsertest/", "CalculatorService"));
    }

    /**
     * 
     * @return
     *     returns Calculator
     */
    @WebEndpoint(name = "CalculatorPort")
    public Calculator getCalculatorPort() {
        return super.getPort(new QName("http://javawebsertest/", "CalculatorPort"), Calculator.class);
    }

    /**
     * 
     * @param features
     *     A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.
     * @return
     *     returns Calculator
     */
    @WebEndpoint(name = "CalculatorPort")
    public Calculator getCalculatorPort(WebServiceFeature... features) {
        return super.getPort(new QName("http://javawebsertest/", "CalculatorPort"), Calculator.class, features);
    }

}
```

und


```
package service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;


/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.6 in JDK 6
 * Generated source version: 2.1
 * 
 */
@WebService(name = "Calculator", targetNamespace = "http://javawebsertest/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface Calculator {


    /**
     * 
     * @param arg1
     * @param arg0
     * @return
     *     returns long
     */
    @WebMethod
    @WebResult(partName = "return")
    public long addValues(
        @WebParam(name = "arg0", partName = "arg0")
        int arg0,
        @WebParam(name = "arg1", partName = "arg1")
        int arg1);

}
```

Ich würd mich über eine Denkanstoß sehr freuen!


----------



## bygones (18. Aug 2010)

versteh nicht so ganz was du genau willst... 

du schreibst dir einen Webservice und publizierst diesen, daraus wird dann eine wsdl generiert.

Um nun einen Client für deinen Webservice schreiben zu können kannst du per wsimport Befehl dir deinen Clientbasisklassen generieren lassen.

Nun kannst in einem beliebigen Projekt mithilfe dieser Clientklassen deinen Webservice aufrufen.


----------



## Taramsis (18. Aug 2010)

D.h die wsdl wird automatisch durch wsimport definiert! 
Und meine Serverklasse bestimmt wie diese ausehen wird:


```
package server;

import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

@WebService
@SOAPBinding(style=Style.RPC)


public class Calculator {

    public long addValues(int val1, int val2) {
        return val1 + val2;
    }

}
```


```
package server;

import javax.xml.ws.Endpoint;

public class CalculatorServer {

    /**
     * @param args the command line arguments
     */
    public static void main (String args[]) {
        Calculator server = new Calculator();
        Endpoint endpoint =
        Endpoint.publish("http://localhost:8080/calculator", server);

    }


}
```

Wenn ich jetzt z.B. in mehreren wsdls Webservices definiert habe und diese über meine Java-Klasse aufrufen möchte, müßte ich dies entsprechend in den oberen Klassen implementieren und durch "wsimport" für einen Client bereitstellen?
Hab ich das richtig verstanden???


----------



## bygones (18. Aug 2010)

Taramsis hat gesagt.:


> D.h die wsdl wird automatisch durch wsimport definiert!


nein die wsdl wird nicht durch import erzeugt, da werden deine Generate erstellt. Durch das "publish" wird die wsdl erzeugt. Kannst du auch so überprüfen, dass du vor dem import mal die URL ansteuerst...



Taramsis hat gesagt.:


> Und meine Serverklasse bestimmt wie diese ausehen wird:


ja



Taramsis hat gesagt.:


> Wenn ich jetzt z.B. in mehreren wsdls Webservices definiert habe und diese über meine Java-Klasse aufrufen möchte, müßte ich dies entsprechend in den oberen Klassen implementieren und durch "wsimport" für einen Client bereitstellen?
> Hab ich das richtig verstanden???


wenn du schon die wsdl hasts musst du nur noch über import dir deine Generate erstellen. Bzw jeder der deinen Webservice nutzen will kann sich die Generate selbst erstellen.


----------



## Taramsis (18. Aug 2010)

Ich habe grad mal probiert über wsimport auf meine wsdl zuzugreifen aber leider funzt es nicht.

Die wsdl ist über SOAPUI-plugin von netbeans oder stylus studio aufrufbar und ausführührbar. Nun habe ich meine Tomacat server gestartet und versucht mein über  den Pfad, denn ich auch bei den anderen Tools benutze den Generate zu erzeugen:



> http://127.0.0.1:8080/blub/bla/test?wsdl



Hat jemand ne Idee


----------



## bygones (18. Aug 2010)

Taramsis hat gesagt.:


> Nun habe ich meine Tomacat server gestartet und versucht mein über  den Pfad, denn ich auch bei den anderen Tools benutze den Generate zu erzeugen:


mit dem URL aufruf erzeugst du auch nix... das geht über die Endpoint klasse...


----------



## Taramsis (18. Aug 2010)

d.h. ich muss die URL beim Aufruf von endpoint in der Klasse "CalculatorServer" ändern?


----------



## bygones (18. Aug 2010)

Taramsis hat gesagt.:


> d.h. ich muss die URL beim Aufruf von endpoint in der Klasse "CalculatorServer" ändern?



die URL muss auf den Webservice zeigen, also wenn dein Service dann deployed wird unter http://myserver:8096/something/theService musst du als Endpoint auch diesen angeben. Danach kannst du unter http://myserver:8096/something/theService?wsdl auf die wsdl zugreifen.


----------



## Taramsis (19. Aug 2010)

Vielen Dank erstmal!
Wie kann man über diese "code first"-Methode nun einen weitere Webservice aufrufen?

Ich meine damit ich möchte in Java einen Webservice der dann zugriff auf weitere hat!
Meine Idee ist :
1. eine webservice in Java schreiben
2. eine klasse mit den entsprechenden zugriffen auf die bereits bestehenden webservice (dies ist die große Frage, wie??)

Empfielt sich da eher die "Code first" oder die "contact first" Methode?


----------

