Webservice definieren und andere Webservice aufrufen

Taramsis

Bekanntes Mitglied
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.
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:


erstellt:


Java:
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

Java:
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!
 
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.
 
D.h die wsdl wird automatisch durch wsimport definiert!
Und meine Serverklasse bestimmt wie diese ausehen wird:

Java:
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;
    }

}

Java:
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???
 
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...

Und meine Serverklasse bestimmt wie diese ausehen wird:
ja

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.
 
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?
 

Zurück
Oben