RSS

Schlagwort-Archive: wsdl

JAX-WS: Webservices mit SOAP

JAX-WS: Webservices mit SOAP

Nachdem ich bereits JAX-RS in der Reihe „JSON Provider erstellen“ behandelt habe, bleibt noch das Pendant, nämlich JAX-WS über. Während sich JAX-RS mit REST-Services befasst, geht es bei JAX-WS um SOAP. Die Referenzimplementierung für JAX-WS ist unter http://jax-ws.java.net/ zu finden.

Wer sich für JAX-RS interessiert, der sei auf folgende Artikel in diesem Blog verwiesen:

Bei JAX-WS gibt es zwei  Herangehensweisen, wie man einen Web-Service erstellt:

  • Bottom-Up:
    Erstellen der Java-Klassen (POJOs) und generieren des Web-Services
  • Top-Down:
    Erstellen der WSDL und generieren der Java-Klassen daraus

Bottom-Up

Vorgehensweise:

  1. Erstellen eines einfachen „Java“ Projektes in Eclipse.
    Hinweis: Will man den WebService anschließend auf einem Applikationsserver oder Tomcat deployen, macht es mehr Sinn ein Dynamisches Web-Projekt mit EAR als Projekt-Template zu verwenden.
  2. Definition des Web Service Endpoints:
    Ein Web Service Endpoint wird mit @WebService (bzw. javax.jws.WebService) annotiert. Die Klasse ist die Implementierungsklasse des WebServices.
  3. Optional: Definition des Service Endpoint Interfaces (SEI):
    Das SEI ist ein Java-Interface, das die Methoden deklariert, die ein WS Client aufrufen kann. Es ist nicht notwendig SEIs zu deklarieren, da durch die @WebService Annotation der Implementierungsklasse implizit ein SEI deklariert wird. Meiner Meinung nach kann die Verwendung von SEIs aber die Übersichtlichkeit erhöhen. Verwendet man SEIs, dann  muss man in der @WebService Annotation der Implementierungsklasse das Element endpointInterface hinzufügen.
  4. Server zum Starten des WS implementieren bzw. WS deployen
  5. JAX-WS Client implementieren

Ohne SEI

Ohne die Verwendung von SEIs, sieht eine einfache Implementierung eines JAX-WS WebServices wie folgt aus:
package ohnesei;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService()
public class Hello {
  private String message = new String("Hello, ");

  public void Hello() {}

  @WebMethod()
  public String sayHello(String name) {
    return message + name + ".";
  }
}
Mit einfachen Mitteln kann man einen Server implementieren, der den WS startet:
package ohnesei;

import javax.xml.ws.Endpoint;

public class TestWsServer
{
   public static void main( final String[] args )
   {
      String url = ( args.length > 0 ) ? args[0] : "http://localhost:4434/miniwebservice";
      Endpoint.publish( url, new Hello() );
   }
}

Inhalt in Eclipse:

Startet man den TestWSServer ohne Argumente, dann kann man sich im Browser die WSDL http://localhost:4434/miniwebservice?wsdl

 

Mit SOAPUI kann man den WebService testen:

 

Mit SEI

Mit Verwendung von SEIs definiert man zusätzlich eine Interface Klasse (das SEI):
package mitsei;

import javax.jws.*;

@WebService
public interface HelloIF
{
   public String sayHello(String name);
}
Die Implementierungklasse sieht dann wie folgt aus:
package mitsei;

import javax.jws.WebService;

@WebService( endpointInterface="mitsei.HelloIF" )
public class Hello implements HelloIF
{
   private String message = new String("Hello, ");

   public void Hello() {}

   public String sayHello(String name) {
       return message + name + "!";
     }
}

Man beachte die Erweiterung:
@WebService( endpointInterface="mitsei.HelloIF" )

Der Server, zum Starten des WS:

package mitsei;

import javax.xml.ws.Endpoint;

import mitsei.Hello;

public class TestWsServer
{
   public static void main( final String[] args )
   {
      String url = ( args.length > 0 ) ? args[0] : "http://localhost:4435/miniwebservice";
      Endpoint.publish( url, new Hello() );
   }
}

Der Client zum Testen:

package mitsei;

import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class TestWsClient
{
   public static void main( final String[] args ) throws Throwable
   {
      String url = ( args.length > 0 ) ? args[0] : "http://localhost:4435/miniwebservice";
      Service service = Service.create(
            new URL( url + "?wsdl" ),
            new QName( "http://mitsei/", "HelloService" ) );
      HelloIF halloWelt = service.getPort( HelloIF.class );
      System.out.println( "n" + halloWelt.sayHello( args.length > 1 ? args[1] : "" ) );
   }
}

Inhalt in Eclipse:

Annotationen

Sowohl das SEI, als auch die Implementierungsklasse müssen mit @WebService annotiert sein (siehe Beispiele vorher). Bei Bedarf kann der Entwickler mittels der Annotationen @WebMethod, @WebParam und@WebResult auf die Schnittstellenbeschreibung Einfluss nehmen.
@WebMethod(operationName="sayHello")
 public @WebResult(name="hellomessage") String sayHello(@WebParam(name="name") String name) {
	    return message + name + "!";
	  }

Mit @Oneway werden Methoden definiert, die asynchronen ausgeführt werden sollen, d.h. der Client wird für die Ausführung der Methode nicht blockiert. Diese Vorgehensweise nach dem Fire-and-Forget-Prinzip funktioniert allerdings nur bei Methoden, die kein Ergebnis zurückliefern.

In der Implementierungsklasse kann man mit @PostConstruct und @PreDestroy Methoden definieren, um Initialisierungs- bzw. Aufräumarbeiten  nach Initialisieren des WebServices bzw. vor dem Zerstören des WebServices zu erledigen.

Top-Down

Der Top-Down Ansatz, auch Contract-First genannt, beruht darauf, aus einer bestehenden Schnittstellen-Beschreibung (WSDL) einen WebService zu erstellen. JAX-WS bietet hierzu das Tool „wsimport“ an, welches aus der vorhandenen WSDL die entsprechenden Java-Artefakte generiert.

Vorausgesetzt, der im letzten Abschnitt erstellte WebService läuft noch, kann man wie folgt die Artefakte erstellen:

juergen@vostro:~$ cd
juergen@vostro:~$ mkdir loeschen
juergen@vostro:~$ cd loeschen
juergen@vostro:~/loeschen$ mkdir generated
juergen@vostro:~/loeschen$ wsimport -d generated http://localhost:4435/miniwebservice?wsdl

Im Beispiel werden die Java-Artefakte in folgendem Verzeichnis abgelegt:

juergen@vostro:~$ ls -R ~/loeschen/generated
/home/juergen/loeschen/generated:
mitsei

/home/juergen/loeschen/generated/mitsei:
HelloIF.class       ObjectFactory.class  SayHello.class
HelloService.class  package-info.class   SayHelloResponse.class

Will man die generierten Java Dateien beibehalten, muss man die Option „-keep“ anwenden:

juergen@vostro:~/loeschen$ wsimport -d generated -keep http://localhost:4435/miniwebservice?wsdl

juergen@vostro:~/loeschen$ ls -R ~/loeschen/generated
/home/juergen/loeschen/generated:
mitsei

/home/juergen/loeschen/generated/mitsei:
HelloIF.class       ObjectFactory.class  SayHello.class
HelloIF.java        ObjectFactory.java   SayHello.java
HelloService.class  package-info.class   SayHelloResponse.class
HelloService.java   package-info.java    SayHelloResponse.java

Mit der Option „-p <Package Name>“ kann man noch einen zu generierenden Package-Namen mitgeben:

juergen@vostro:~/loeschen$ wsimport -d generated -p mitsei.generated -keep http://localhost:4435/miniwebservice?wsdl

juergen@vostro:~/loeschen$ ls -R ~/loeschen/generated
/home/juergen/loeschen/generated:
mitsei

/home/juergen/loeschen/generated/mitsei:
generated

/home/juergen/loeschen/generated/mitsei/generated:
HelloIF.class       ObjectFactory.class  SayHello.class
HelloIF.java        ObjectFactory.java   SayHello.java
HelloService.class  package-info.class   SayHelloResponse.class
HelloService.java   package-info.java    SayHelloResponse.java

Wie kann man sich nun damit einen WebService bauen?

Zuerst kann man die generierten Dateien in das Workspace Verzeichnis von Eclipse kopieren. Da wir bereits ein Projekt mit einem Package „mitsei“ im vorigen Abschnitt erstellt haben, kopieren wir die Dateien einfach hier hinein.

Beispiel:

juergen@vostro:~/workspace/JAXWSTest/src/mitsei$ cp -R ~/loeschen/generated/mitsei/generated .

Anschließend refreshen wir in Eclipse das Projekt (Projekt-Explorer + F5):

In vielen Fällen wird es so sein, dass man eine WSDL von einem bereits existierenden WebService erhält und diesen nun nutzen will. D.h. man erstellt einen Client, der den WebService aufruft. Im folgenden will ich den WebService einfach nutzen. Nachdem ich mir via „wsimport“ alle notwendigen Artefakte erzeugt habe, erstelle ich einen Java-Client, der in der Lage ist, den WebService aufzurufen:

package mitsei.generated;

import javax.xml.ws.BindingProvider;

public class TestWsClient {
	public static void main(String[] args) {

		HelloService service = new HelloService();
		HelloIF port = service.getHelloPort();

		// BindingProvider bp = (BindingProvider) port;
		// bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "test");
		// bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "test");

		String request = "Jürgen";
		System.out.println (" Request:  "" + request + """ );
		String response = port.sayHello(request);
		System.out.println ("Response:  "" + response + """ );
	}

}

Den Client „TestWsClient“ erstelle ich der Einfachheit halber direkt im Package „mitsei.generated“:

Hier die Ausgabe:

 

XSD und WSDL

Eine XSD (XML Schema Definition) beschreibt den Aufbau einer XML Datei. Sie ist der Nachfolger der klassischen DTD (Document Type Definition).

Die WSDL (Web Services Description Language) hingegen beschreibt den Aufbau eines SOAP WebServices, also u.a. die Operationen bzw. Schnittstellen, deren Übergabe- und Rückgabe-Parameter. Damit ist es auch notwendig, erlaubte bzw. verwendete Datentypen zu beschreiben. Man tut dies in Form einer oder mehrerer XSDs, die man von extern inkludiert oder inline innerhalb der WSDL definiert.

Für die Erstellung von XSDs und WSDLs gibt es zahlreiche Tools, siehe hierzu die Abschnitte „Links„.

XSD in WSDL inkludieren

Hier ein Beispiel (lokale Datei):

	<wsdl:types>
		<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.websale-ag.com/StockUpdateService">
			<xsd:import namespace="http://www.websale-ag.com/xsd/StockUpdateService" schemaLocation="stockupdate.xsd"></xsd:import>
		</xsd:schema>
	</wsdl:types>

Hier ein Beispiel (XSD über URL):

<types>
<xsd:schema>
<xsd:import namespace="http://ohnesei/" schemaLocation="http://localhost:4434/miniwebservice?xsd=1"></xsd:import>
</xsd:schema>
</types>

XSD in WSDL inline definieren

Hier ein Beispiel (mit zwei XSD Inline Defintionen):

   <wsdl:types>
      <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:websale="http://www.websale.net/soap/faults" xmlns:p0="http://www.websale-ag.com/xsd/StockUpdateService" targetNamespace="http://www.websale-ag.com/xsd/StockUpdateService">
         <xsd:complexType name="SoapFault">
            <xsd:sequence>
               <xsd:element name="faultcode" type="xsd:string" />
               <xsd:element name="faultstring" type="xsd:string" />
               <xsd:element name="details" type="p0:Details" />
            </xsd:sequence>
 ...
      </xsd:schema>
      <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:p0="http://www.websale.net/soap/faults" targetNamespace="http://www.websale.net/soap/faults">
         <xsd:simpleType name="Code">
            <xsd:restriction base="xsd:int">
               <xsd:minInclusive value="0" />
            </xsd:restriction>
         </xsd:simpleType>
      </xsd:schema>
...

Aufbau einer WSDL Datei

Die folgende Beschreibung einer WSDL Datei, habe ich bei http://www.torsten-horn.de/techdocs/jee-jax-ws.htm gefunden:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" WSDL-Namespace
             targetNamespace="...">                   Target-Namespace

  <import> ... </import>                              Importe externer WSDL-Dateien

  <types>                                             Typdeklarationen:
    <xsd:schema> ... </xsd:schema>                      Wahlweise Einbettung von Schema-Informationen
  </types>                                              oder Importe externer Schema-XSD-Dateien

  <message ...><part ... /></message>                 "Messages" sind Parameter und Rückgabewerte (z.B. definiert über XSD)

  <portType ...>                                      "Port Types" entsprechen Java-Interfaces:
    <operation ...>                                     "Operations" entsprechen Java-Methoden:
      <input  ... />                                      Input-Messages (Argumentparameter)
      <output ... />                                      Output-Messages (Rückgabewerte)
      <fault  ... />                                      Fehlernachrichten (z.B. Exceptions)
    </operation>
  </portType>

  <binding ...>                                       "Bindings" sind Verbindungen von "Port Types" zu Protokollen:
    <soap:binding ... />                                Z.B. SOAP-Protokoll über HTTP mit style="document"
    <operation ...>                                     Pro "Operation" Zusatzangaben:
      <soap:operation ... />                              Z.B. soapAction=""
      <input> <soap:body ... /></input>                   Z.B. use="literal"
      <output><soap:body ... /></output>                  Z.B. use="literal"
      <fault ...><soap:fault ... /></fault>               Z.B. use="literal"
    </operation>
  </binding>

  <service ...>                                       "Services" sind Gruppen von "Ports"
    <port ...>                                          "Ports" beschreiben den Zugang zu Diensten
      <soap:address ... />                                Z.B. location="..." (URL des Dienstes)
    </port>
  </service>

</definitions>

 

Links

Tutorials:

http://www.mkyong.com/tutorials/jax-ws-tutorials/

Tools:

freeformatter.com: zahlreiche Online-Tools für JSON, XML, HTML, XSD: Formatter, Validator, Encoder

xmlforasp.net: Online-Umwandlung einer XML-Datei in eine XSD-Datei (XML-Schema)

Microsoft Windows SDK for Windows 7 and .NET Framework 4: enthält u.a. auch Tools, wie xsd.exe oder wsdl.exe

JDKOpenJDK (Java Development Kit): enthält Tools wie wsgen und wsimport

 
Hinterlasse einen Kommentar

Verfasst von - April 13, 2012 in WebServices

 

Schlagwörter: , , , ,

JSON Provider erstellen. Part 2: Axis2 auf Tomcat installieren

JSON Provider erstellen. Part 2: Axis2 auf Tomcat installieren

Nachdem im ersten Teil der Tomcat Server zum Laufen gebracht wurde, geht es hier darum, Axis2 auf dem Tomcat Server zu installieren.

Apache Axis2™ ist eine Web Services/SOAP/WSDL Engine, die es auf relative einfache Weise erlaubt Webservices bereitzustellen. Eine Möglichkeit besteht darin sog. POJOs (Plain Old Java Objects), also mehr oder weniger einfache Java-Klassen zu definieren und diese mit Axis2 in einen Web-Service zu „transformieren“. Eine genauere Beschreibung ist hier zu finden.

Man kann Axis2 als Standalone Server, oder auf einem Servlet Container (z.B. Tomcat) bzw. einem vollständigen JEE Server (Applikationsserver wie JBoss etc.) betreiben.

Installation (Tomcat)

1) Download und Entpacken von http://axis.apache.org/axis2/java/core/download.cgi

2) Im entpackten Verzeichnis nach „webapp“ wechseln

3) Zusammenbauen der WAR Datei:

/opt/axis2-1.6.1/webapp$ ant
Buildfile: /opt/axis2-1.6.1/webapp/build.xml

init:
...
prepare.repo:
...
create.war:
      [war] Building war: /opt/axis2-1.6.1/dist/axis2.war
   [delete] Deleting directory /opt/axis2-1.6.1/dist/temp

BUILD SUCCESSFUL
Total time: 3 seconds

4) Kopieren der WAR Datei in das Verzeichnis „webapps“ des Servlet-Containers:

/opt/apache-tomcat-6.0.35$ sudo cp /opt/axis2-1.6.1/dist/axis2.war ./webapps/

5) Durch das Kopieren in den „webapps“  Folder, wird die Datei (bei laufendem Tomcat) automatisch deployed. Man kann das, nach kurzer Zeit, im Log File (/opt/apache-tomcat-6.0.35/logs$ sudo tail -50 catalina.out), in der Manager Applikation (http://localhost:8080/manager/html) und durch Aufrufen der URL (localhost:8080/axis2) sehen.

Bei Problemen kann im Log File bzw. im Manager überprüft werden, ob die Web-Applikation auch gestartet wurde!

Axis2 Admin Konsole

Für Axis2 gibt es eine Admin-Konsole mit dem Default-Account „admin“/“axis2“ unter http://localhost:8080/axis2/axis2-admin/login.

Sie können den Benutzernamen und das Kennwort in der Datei „axis2.xml“ nach Bedarf ändern.

WebServices erstellen:

Axis2 bietet mehrere Möglichkeiten WebServices zu erstellen:

– über JAX-WS, siehe auch Apache Axis2 – JAX-WS Guide

– über sog. POJOs, siehe auch POJO Web Services using Apache Axis2

– aus einem vorhandenen WSDL Dokument

– etc.

Im Folgenden beziehe ich  mich auf die Nutzung sog. POJOs.

Axis2 WebService mit POJOs

Mit Axis2 kann man durch eine sog. Service-Klasse einen WebService in Java programmieren. Zudem ist es möglich über diesen WebService JavaBeans anzusprechen (nicht mit EJBs – Enterprise Java Beans zu verwechseln). Die Verwendung von JavaBeans ermöglicht eine Modularisierung des Web-Applikation.

Service Klasse und services.xml

Die Erstellung eines Axis2 WebServices mit POJOs (ohne JavaBeans) lässt sich relativ schnell erledigen. Sie erstellen eine Service-Klasse, in einem beliebigen Projekt-Verzeichnis und anschließend eine services.xml Datei.

Service-Klasse:

package sample;

public class SampleService {

    public String echo(String value) {
        return value;
    }

    public int add(int a, int b) {
        return a + b;
    }

    public void update(int c) {

    }
}

 

services.xml Datei:

<service name="SampleService">
 <description>This is my Sample Service</description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
                         class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                         class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass">sample.SampleService</parameter>
</service>

 

Verwendung von Eclipse als IDE

Ich  habe in Eclipse ein Projekt „SampleService“ angelegt und die Klasse „SampleService“ im Paket „sample“ unter „src“ angelegt. Außerdem habe in „src“ ein Verzeichnis „META-INF“ erstellt und darin die Datei „services.xml“ abgelegt:

Anschließend habe ich die Datei „build.xml“ aus „Axis2_HOME/samples/pojoguide“ in das Projektverzeichnis kopiert und angepasst: build.xml

Führt man nun build.xml mit ant aus, wird eine aar Datei (Tomcat Webservice Paket) erstellt, die man nun auf Axis2 im Tomcat deployen kann.

Deployment

Wie bringt man nun den Service auf den Tomcat Server?

  1. Rufen Sie die URL für den Tomcat Server auf, z.B.: http://localhost:8080/
  2. Selektieren Sie Administration > Tomcat Manager
  3. Selektieren Sie unter „Application“ den Pfad „/axis2“
  4. Selektieren Sie den Link „Administration“
  5. Geben Sie Username und Passwort ein (Default: admin/axis2) und drücken Sie den „Login“ Knopf
  6. Wählen Sie den Link: Tools > Upload Service
  7. Wählen Sie „Durchsuchen“ und selektieren Sie das aar File
  8. Drücken Sie den „Upload“ Knopf
  9. Wenn alles glatt gelaufen ist, sehen Sie unter „System Components“ > „Available Services“ den Service „“. (Hinweis: Es kann sein, dass Sie einen Augenblick warten müssen und die Anzeige refreshen müssen, bis der Service sichtbar ist).

Die WSDL des WebServices lautet: „http://localhost:8080/axis2/services/SampleService?wsdl&#8220;.

Testen des WebServices mit SOAP UI

SoapUI ist ein hervorragendes, freies Tool zum Testen von WebServices, sofern man die WSDL zur Verfügung hat. Die Installation geht einfach und schnell von statten. Man legt nach der Installation ein neues Projekt an und wählt die URL der WSDL (http://localhost:8080/axis2/services/SampleService?wsdl). Anschließend kann man die verschiedenen Operationen des WebServices testen. Alternativ kann man sich auch einen sog, RPCClient programmieren und damit den WebService testen (s.u.).

Testen des WebServices mit einem RPC Client

Alternativ zu SoapUI kann man einen sog. RPC Client programmieren und die Funktionalität des WebServices testen (siehe hierzu: Testing the POJO Web Service Using RPCServiceClient).

Erstellen Sie hierzu in Eclipse eine Java-Klasse „SampleServiceRPCClient“ im Paket „sample.rpcclient“:

package sample.rpcclient;
import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class SampleServiceRPCClient {
    public static void main(String[] args1) throws AxisFault {

        RPCServiceClient serviceClient = new RPCServiceClient();

        Options options = serviceClient.getOptions();

        EndpointReference targetEPR = new EndpointReference(
                "http://localhost:8080/axis2/services/SampleService");
        options.setTo(targetEPR);

        // Setting the add Operation
        QName opEcho =
            new QName("http://sample", "echo");

        // Setting the parameters for the Operation:
        Object[] opSetSampleServiceArgs = new Object[] { "jkhofmann" };

        Class[] returnTypes = new Class[] { String.class };

        Object[] response = serviceClient.invokeBlocking(opEcho,
        		opSetSampleServiceArgs, returnTypes);

        String result = (String) response[0];

        if (result == null) {
            System.out.println("SampleService didn't initialize!");
            return;
        }        

        // Displaying the result
        System.out.println("Echo : " + result);

    }
}

 

Beachten Sie, dass in diesem Beispiel keine JavaBean als Business-Klasse verwendet wird, vielmehr wird der Service direkt angesprochen. Um eine JavaBean als Business-Klasse dazwischenzuschalten, verfolgen Sie bitte den Artikel „POJO Web Services using Apache Axis2“.

Hinweis: Die Fehlermeldungen in der Eclipse IDE können Sie ignorieren, es handelt sich dabei um fehlende Einträge im Build-Path. Diese werden über das Target „rpc.client.run“ in build.xml automatisch geladen. Wenn Sie also den Client testen wollen, verwenden Sie die Eclipse IDE oder ant mit dem Target „rpc.client.run“, oder ziehen Sie die fehlenden Libraries aus Axis2 in den Build-Path des Eclipse-Projektes.

Das Ergebnis über Eclipse/build.xml mit dem Target „rpc.client.run“ sollte wie folgt aussehen:

rpc.client.run:
     [java] log4j:WARN No appenders could be found for logger (org.apache.axis2.context.AbstractContext).
     [java] log4j:WARN Please initialize the log4j system properly.
     [java] Echo : jkhofmann
BUILD SUCCESSFUL
Total time: 4 seconds

 

Testen des WebServices mit WSDL2Java.sh

Axis2 liefert ein Skript mit, welches die komfortable Erstellung von Services und Clients erlaubt. Es nennt sich „wsdl2java.sh“ und ist im „bin“ Verzeichnis der Axis2-Installation zu findet. Hierzu muss lediglich die WSDL vorhanden sein, über die WSDL-URI kann man sich mit diesem Skript die Client-Anteile generieren lassen.

Die Clients können auf verschiedene Arten generiert werden. Mit der Option „-d“ kann man festlegen, wie die XML-Struktur des Services in Java-Objekte umgesetzt wird – Databinding. Läßt man die Option weg, werden XML-in-out Stubs generiert, ohne Databinding.

Verwendet man Databinding, kann man zwischen folgenden Optionen wählen:

  • Axis2 Databinding Framework (ADB): einfach, aber gewisse Einschränkungen bei XML Schemas
  • XMLBeans: voller Schema-Kompiler, aber etwas komplizierter als ADB
  • JiBX: JiBXist ein komplettes Databinding-Framework

siehe hierzu auch: „Choosing a Client Generation Method„.

Neben der Option für das Databindung (-d) kann man mit „-s“ synchrone bzw. blockierende Clients erzeugen lassen, also Clients die beinem Request auf den Response warten. Eine weitere nützliche Option ist „-p“, mit ihr kann man den Namespace (Package-Pfad) des Clients festlegen. Zu guter Letzt finde ich die Option „-o“ noch nützlich, da man mit ihr ein Zielverzeichnis für den generierten Code festlegen kann.

Im folgenden will ich beispielhaft veranschaulichen, wie man einen Client, ganz ohne Databinding, generiert und ausprogrammiert.

  1. Erstellen eines temporären Verzeichnisses und wechseln in das Verzeichnis
  2. Generieren des Client-Stubs:
    /opt/axis2-1.6.1/bin/wsdl2java.sh -uri http://localhost:8080/axis2/services/SampleService?wsdl -p
    sample.wsdl2java.client -s

    Das Ergebnis:

    juergen@vostrou64:~/loeschen$ ls -lR
    .:
    insgesamt 12
    -rw-rw-r-- 1 juergen juergen 5151 2011-12-29 03:23 build.xml
    drwxrwxr-x 3 juergen juergen 4096 2011-12-29 03:23 src
    ...
    ./src/sample/wsdl2java/client:
    -rw-rw-r-- 1 juergen juergen 132306 2011-12-29 03:23 SampleServiceStub.java 

     

  3. Projekt in Eclipse anlegen bzw. ergänzen um die Klasse
    sample.wsdl2java.client.SampleServiceStub
  4. Inhalt der Klasse vom temporären Verzeichnis in Eclipse kopieren
  5. Build-Path von Eclipse anpassen. Es müssen die entsprechenden JARs aus der Axis2 Installation im lib Verzeichnis hinzugefügt werden.
  6. Client erstellen:
    package sample.wsdl2java.client;
    
    import sample.wsdl2java.client.SampleServiceStub.*;
    
    public class Client {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
            try {
                SampleServiceStub stub =
                    new SampleServiceStub
                    ("http://localhost:8080/axis2/services/SampleService");
    
                // Aufruf der Services:
                echo(stub);
                add(stub);
            } catch(Exception e) {
                e.printStackTrace();
                System.out.println("nnn");
            }	        
    	}
    
        /* Echo Service */
        public static void echo(SampleServiceStub stub){
            try{
                Echo req = new Echo();
                req.setArgs0("Hello World");
                EchoResponse resp = stub.echo(req);
                String response = resp.get_return();
                System.out.println("Response = " + response);
            } catch(Exception e){
                e.printStackTrace();
                System.out.println("nnn");
            }
        }
    	
        /* Add Service */
        public static void add(SampleServiceStub stub){
            try{
                Add req = new Add();
                req.setArgs0(1);
                req.setArgs1(2);
                AddResponse resp = stub.add(req);
                int response = resp.get_return();
                System.out.println("Response = " + response);
            } catch(Exception e){
                e.printStackTrace();
                System.out.println("nnn");
            }
        }
        
    }
  7. Kompilieren und testen.
 
Hinterlasse einen Kommentar

Verfasst von - Dezember 27, 2011 in Linux, WebServices

 

Schlagwörter: , , , , ,

 
Erstelle eine Website wie diese mit WordPress.com
Jetzt starten