blob: 2081af6d1664dae577f05197f6421cc53298ea75 [file] [log] [blame]
<?xml version="1.0" encoding=""?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="" />
<title>Generating a Web Service Client using Axis2 and JiBX</title>
<link href="../css/axis-docs.css" rel="stylesheet" type="text/css"
media="all" />
</head>
<body>
<h1 class="title">Generating a Web Service Client using Axis2 and JiBX</h1>
<p>This document explains how to generate a Web service client using Axis2
and JiBX data binding. The service has the following WSDL:</p>
<p><b>Code Listing 1: The WSDL file</b></p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;wsdl:definitions
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://apache.org/axis2/Axis2UserGuide"
xmlns:intf="http://apache.org/axis2/Axis2UserGuide"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://apache.org/axis2/Axis2UserGuide"&gt;
&lt;wsdl:types&gt;
&lt;schema
elementFormDefault="qualified"
targetNamespace="http://apache.org/axis2/Axis2UserGuide"
xmlns="http://www.w3.org/2001/XMLSchema"&gt;
&lt;!-- ELEMENTS --&gt;
&lt;element name="DoInOnlyRequest"&gt;
&lt;complexType&gt;
&lt;sequence&gt;
&lt;element name="messageString" type="xsd:string"/&gt;
&lt;/sequence&gt;
&lt;/complexType&gt;
&lt;/element&gt;
&lt;element name="TwoWayOneParameterEchoRequest"&gt;
&lt;complexType&gt;
&lt;sequence&gt;
&lt;element name="echoString" type="xsd:string"/&gt;
&lt;/sequence&gt;
&lt;/complexType&gt;
&lt;/element&gt;
&lt;element name="TwoWayOneParameterEchoResponse"&gt;
&lt;complexType&gt;
&lt;sequence&gt;
&lt;element name="echoString" type="xsd:string"/&gt;
&lt;/sequence&gt;
&lt;/complexType&gt;
&lt;/element&gt;
&lt;element name="NoParametersRequest"&gt;
&lt;complexType/&gt;
&lt;/element&gt;
&lt;element name="NoParametersResponse"&gt;
&lt;complexType/&gt;
&lt;/element&gt;
&lt;element name="MultipleParametersAddItemRequest"&gt;
&lt;complexType&gt;
&lt;sequence&gt;
&lt;element name="itemId" type="xsd:int"/&gt;
&lt;element name="itemName" type="xsd:string"/&gt;
&lt;element name="price" type="xsd:float"/&gt;
&lt;element name="description" type="xsd:string"/&gt;
&lt;/sequence&gt;
&lt;/complexType&gt;
&lt;/element&gt;
&lt;element name="MultipleParametersAddItemResponse"&gt;
&lt;complexType&gt;
&lt;sequence&gt;
&lt;element name="itemId" type="xsd:int"/&gt;
&lt;element name="successfulAdd" type="xsd:boolean"/&gt;
&lt;/sequence&gt;
&lt;/complexType&gt;
&lt;/element&gt;
&lt;/schema&gt;
&lt;/wsdl:types&gt;
&lt;!-- MESSAGES --&gt;
&lt;wsdl:message name="DoInOnlyRequestMessage"&gt;
&lt;wsdl:part name="input" element="impl:DoInOnlyRequest"/&gt;
&lt;/wsdl:message&gt;
&lt;wsdl:message name="TwoWayOneParameterEchoRequestMessage"&gt;
&lt;wsdl:part name="input" element="impl:TwoWayOneParameterEchoRequest"/&gt;
&lt;/wsdl:message&gt;
&lt;wsdl:message name="TwoWayOneParameterEchoResponseMessage"&gt;
&lt;wsdl:part name="output" element="impl:TwoWayOneParameterEchoResponse"/&gt;
&lt;/wsdl:message&gt;
&lt;wsdl:message name="NoParametersRequestMessage"&gt;
&lt;wsdl:part name="input" element="impl:NoParametersRequest"/&gt;
&lt;/wsdl:message&gt;
&lt;wsdl:message name="NoParametersResponseMessage"&gt;
&lt;wsdl:part name="output" element="impl:NoParametersResponse"/&gt;
&lt;/wsdl:message&gt;
&lt;wsdl:message name="MultipleParametersAddItemRequestMessage"&gt;
&lt;wsdl:part name="input" element="impl:MultipleParametersAddItemRequest"/&gt;
&lt;/wsdl:message&gt;
&lt;wsdl:message name="MultipleParametersAddItemResponseMessage"&gt;
&lt;wsdl:part name="output" element="impl:MultipleParametersAddItemResponse"/&gt;
&lt;/wsdl:message&gt;
&lt;!-- Port type (operations) --&gt;
&lt;wsdl:portType name="Axis2UserGuidePortType"&gt;
&lt;wsdl:operation name="DoInOnly" parameterOrder="input"&gt;
&lt;wsdl:input name="DoInOnlyRequestMessage"
message="impl:DoInOnlyRequestMessage"/&gt;
&lt;/wsdl:operation&gt;
&lt;wsdl:operation name="TwoWayOneParameterEcho" parameterOrder="input"&gt;
&lt;wsdl:input name="TwoWayOneParameterEchoRequestMessage"
message="impl:TwoWayOneParameterEchoRequestMessage"/&gt;
&lt;wsdl:output name="TwoWayOneParameterEchoResponseMessage"
message="impl:TwoWayOneParameterEchoResponseMessage"/&gt;
&lt;/wsdl:operation&gt;
&lt;wsdl:operation name="NoParameters" parameterOrder="input"&gt;
&lt;wsdl:input name="NoParametersRequestMessage"
message="impl:NoParametersRequestMessage"/&gt;
&lt;wsdl:output name="NoParametersResponseMessage"
message="impl:NoParametersResponseMessage"/&gt;
&lt;/wsdl:operation&gt;
&lt;wsdl:operation name="MultipleParametersAddItem" parameterOrder="input"&gt;
&lt;wsdl:input name="MultipleParametersAddItemRequestMessage"
message="impl:MultipleParametersAddItemRequestMessage"/&gt;
&lt;wsdl:output name="MultipleParametersAddItemResponseMessage"
message="impl:MultipleParametersAddItemResponseMessage"/&gt;
&lt;/wsdl:operation&gt;
&lt;/wsdl:portType&gt;
&lt;!-- BINDING (bind operations) --&gt;
&lt;wsdl:binding
name="Axis2UserGuideSoapBinding"
type="impl:Axis2UserGuidePortType"&gt;
&lt;wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/&gt;
&lt;wsdl:operation name="DoInOnly"&gt;
&lt;wsdlsoap:operation soapAction="DoInOnly"/&gt;
&lt;wsdl:input&gt;
&lt;wsdlsoap:body use="literal"/&gt;
&lt;/wsdl:input&gt;
&lt;/wsdl:operation&gt;
&lt;wsdl:operation name="TwoWayOneParameterEcho"&gt;
&lt;wsdlsoap:operation soapAction="TwoWayOneParameterEcho"/&gt;
&lt;wsdl:input&gt;
&lt;wsdlsoap:body use="literal"/&gt;
&lt;/wsdl:input&gt;
&lt;wsdl:output&gt;
&lt;wsdlsoap:body use="literal"/&gt;
&lt;/wsdl:output&gt;
&lt;/wsdl:operation&gt;
&lt;wsdl:operation name="NoParameters"&gt;
&lt;wsdlsoap:operation soapAction="NoParameters"/&gt;
&lt;wsdl:input&gt;
&lt;wsdlsoap:body use="literal"/&gt;
&lt;/wsdl:input&gt;
&lt;wsdl:output&gt;
&lt;wsdlsoap:body use="literal"/&gt;
&lt;/wsdl:output&gt;
&lt;/wsdl:operation&gt;
&lt;wsdl:operation name="MultipleParametersAddItem"&gt;
&lt;wsdlsoap:operation soapAction="MultipleParametersAddItem"/&gt;
&lt;wsdl:input&gt;
&lt;wsdlsoap:body use="literal"/&gt;
&lt;/wsdl:input&gt;
&lt;wsdl:output&gt;
&lt;wsdlsoap:body use="literal"/&gt;
&lt;/wsdl:output&gt;
&lt;/wsdl:operation&gt;
&lt;/wsdl:binding&gt;
&lt;!-- SERVICE --&gt;
&lt;wsdl:service name="Axis2UserGuideService"&gt;
&lt;wsdl:port binding="impl:Axis2UserGuideSoapBinding"
name="Axis2UserGuide"&gt;
&lt;wsdlsoap:address location="http://localhost:8080/axis2/services/Axis2UserGuide"/&gt;
&lt;/wsdl:port&gt;
&lt;/wsdl:service&gt;
&lt;/wsdl:definitions&gt;</pre>
<p>Note that the document defines four operations, DoInOnly, NoParameters,
TwoWayOneParameterEcho, and MultipleParametersAddItem. Each client will
include methods for calling each of these operations.</p>
<p>(You can get more information on WSDL at <a
href="http://www.w3.org/2002/ws/desc/">http://www.w3.org/2002/ws/desc/</a>
.)</p>
<a name="jibx"></a>
<h2>JiBX</h2>
<p>JiBX is not part of the Apache project, so in order to use it to generate
your clients, you will need to do some setting up to start with. To generate
your client, execute the following steps:</p>
<p><b>The short story</b>:</p>
<ol>
<li>Download the latest JiBX package (tested with JiBX v1.1) from <a
href="http://sourceforge.net/projects/jibx/">http://sourceforge.net/projects/jibx/</a>
. Extract the zip file, and copy the JARs in the lib directory to the
AXIS2_HOME/lib directory. (Delete the stax-api.jar file; it's superseded
by the version that comes with Axis2.)</li>
<li>Download <a
href="http://sourceforge.net/project/showfiles.php?group_id=69358&amp;package_id=122897">xsd2jibx
version beta2a</a> from SourceForge. Create a directory called xsd2jibx
in your working directory and extract the files into it. This utility
does not work with the latest release (v1.1) of JiBX, so download <a
href="http://sourceforge.net/project/showfiles.php?group_id=69358&amp;package_id=68290">jibx-1.0RC1</a>
from SourceForge. Extract the files from this archive and copy the *.jar
files in the lib directory into the xsd2jibx/lib directory.</li>
<li>Create a schema based on the data structures of your WSDL file and save
it in your working directory.</li>
<li>Make sure that only the xsd2jibx jar files are in the classpath and
execute the following command to create the basic binding file: java -jar
xsd2jibx\lib\xsd2jibx.jar Axis2UserGuide.xsd</li>
<li>Copy the org directory to the src directory to place the generated
classes into the project so that the compiler will see them.</li>
<li>Remove the xsd2jibx-related *.jar files from your CLASSPATH and add the
Axis2 .jar files back into it. Execute the following command to generate
the stubs:
<pre>%AXIS2_HOME%\bin\WSDL2Java -uri Axis2UserGuide.wsdl -p org.apache.axis2.axis2userguide -d jibx -Ebindingfile org\apache\axis2\axis2userguide\binding.xml -s</pre>
</li>
<li>Create the client file in the org/apache/axis2/axis2userguide
directory.</li>
<li>Copy the org directory and all its contents to the src directory.</li>
<li>Compile the first set of classes by typing:<code>ant
jar.client</code></li>
<li>Go to the build/classes directory and run the JiBX compiler:
<pre>java -jar C:\apps\axis2\lib\jibx-bind.jar
..\..\org\apache\axis2\axis2userguide\binding.xml</pre>
</li>
<li>Run Ant again to package the new auto-generated JiBX classes into the
client jar by typing: <code>ant jar.client</code></li>
<li>Add the build/lib/Axis2UserGuideService-test-client.jar file to the
CLASSPATH and run the client by typing:
<pre>java org.apache.axis2.axis2userguide.Client</pre>
</li>
</ol>
<p><b>The long story:</b></p>
<p>To use JiBX to generate your client, you first need to use it in two
different functions. You have to generate a binding file that maps objects to
the XML elements, and then use JiBX to generate the stubs that your client
will use. To generate a binding file, you'll need the xsd2jibx utility, which
creates a binding file from an XML Schema document. Once you have the binding
file, you can run JiBX to create the actual object. In order to do all that
you'll need to have the appropriate versions of the JiBX software.</p>
<p>Download the latest JiBX package (tested with JiBX v1.1) from <a
href="http://sourceforge.net/projects/jibx/">http://sourceforge.net/projects/jibx/</a>.
Extract the zip file, and copy the JARs in the lib directory to the
AXIS2_HOME/lib directory. (Delete the stax-api.jar file; it's superseded by
the version that comes with Axis2.) These files pertain to the main JiBX
application.</p>
<p>Download <a
href="http://sourceforge.net/project/showfiles.php?group_id=69358&amp;package_id=122897">xsd2jibx
version beta2a</a> from Sourceforge. Create a directory called xsd2jibx in
your working directory and extract the files into it. Unfortunately, this
utility does not work with the latest release of JiBX, so you will need to
download <a
href="http://sourceforge.net/project/showfiles.php?group_id=69358&amp;package_id=68290 ">jibx-1.0RC1</a>
from Sourceforge. Extract the files from this archive and place the *.jar
files in the lib directory into the xsd2jibx/lib directory. This way, you can
use them exclusively with the xsd2jibx utility.</p>
<p>You'll need an XML schema from which to generate the binding file, which
links XML elements to the Java classes. As defined in the sample WSDL file,
its content should be as shown in Code Listing 2.</p>
<p><b>Code Listing 2: XML Schema</b></p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;xsd:schema
elementFormDefault="qualified"
targetNamespace="http://apache.org/axis2/Axis2UserGuide"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
&lt;!-- ELEMENTS --&gt;
&lt;xsd:element name="DoInOnlyRequest"&gt;
&lt;xsd:complexType&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="messageString" type="xsd:string"/&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;/xsd:element&gt;
&lt;xsd:element name="TwoWayOneParameterEchoRequest"&gt;
&lt;xsd:complexType&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="echoString" type="xsd:string"/&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;/xsd:element&gt;
&lt;xsd:element name="TwoWayOneParameterEchoResponse"&gt;
&lt;xsd:complexType&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="echoString" type="xsd:string"/&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;/xsd:element&gt;
&lt;xsd:element name="NoParametersRequest"&gt;
&lt;xsd:complexType/&gt;
&lt;/xsd:element&gt;
&lt;xsd:element name="NoParametersResponse"&gt;
&lt;xsd:complexType/&gt;
&lt;/xsd:element&gt;
&lt;xsd:element name="MultipleParametersAddItemRequest"&gt;
&lt;xsd:complexType&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="itemId" type="xsd:int"/&gt;
&lt;xsd:element name="itemName" type="xsd:string"/&gt;
&lt;xsd:element name="price" type="xsd:float"/&gt;
&lt;xsd:element name="description" type="xsd:string"/&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;/xsd:element&gt;
&lt;xsd:element name="MultipleParametersAddItemResponse"&gt;
&lt;xsd:complexType&gt;
&lt;xsd:sequence&gt;
&lt;xsd:element name="itemId" type="xsd:int"/&gt;
&lt;xsd:element name="successfulAdd" type="xsd:boolean"/&gt;
&lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
&lt;/xsd:element&gt;
&lt;/xsd:schema&gt;</pre>
<p>Save the above XML schema file as Axis2UserGuide.xsd.</p>
<p>In order to map this schema into a JiBX binding file, you'll need to use
the xsd2jibx utility. Clear your CLASSPATH and add only the .jar files in the
xsd2jibx/lib directory. Execute the following command to create the basic
binding file:</p>
<pre>java -jar xsd2jibx\lib\xsd2jibx.jar Axis2UserGuide.xsd</pre>
<p>This operation creates the basic class files, as well as the mapping file,
called binding.xml. You'll use this file to do the actual WSDL-to-Java
conversion.</p>
<p>Remove the xsd2jibx .jar files from your CLASSPATH and add the Axis2 .jar
files back into it. Execute the command in Code Listing 3 to generate the
stubs.</p>
<p><b>Code Listing 3: Generating the stubs</b></p>
<pre>%AXIS2_HOME%\bin\WSDL2Java -uri Axis2UserGuide.wsdl -p org.apache.axis2.axis2userguide -d jibx -Ebindingfile org\apache\axis2\axis2userguide\binding.xml -s</pre>
<p>Create the client file, Client.java, in the
org/apache/axis2/axis2userguide directory. Add the following code in Code
Listing 4.</p>
<p><b>Code Listing 4: Creating Client.java</b></p>
<pre>package org.apache.axis2.axis2userguide;
public class Client{
public static void main(java.lang.String args[]){
try{
Axis2UserGuideServiceStub stub =
new Axis2UserGuideServiceStub
("http://localhost:8080/axis2/services/Axis2UserGuideService");
doInOnly(stub);
twoWayOneParameterEcho(stub);
noParameters(stub);
multipleParameters(stub);
} catch(Exception e){
e.printStackTrace();
System.out.println("\n\n\n");
}
}
public static void doInOnly(Axis2UserGuideServiceStub stub){
try{
DoInOnlyRequest req =
new DoInOnlyRequest();
req.setMessageString("fire and forget it!");
stub.DoInOnly(req);
} catch(Exception e){
e.printStackTrace();
System.out.println("\n\n\n");
}
}
public static void twoWayOneParameterEcho(Axis2UserGuideServiceStub stub){
try{
TwoWayOneParameterEchoRequest req =
new TwoWayOneParameterEchoRequest();
req.setEchoString("echo! ... echo!");
System.out.println(stub.TwoWayOneParameterEcho(req).getEchoString());
} catch(Exception e){
e.printStackTrace();
System.out.println("\n\n\n");
}
}
public static void noParameters(Axis2UserGuideServiceStub stub){
try{
NoParametersRequest req =
new NoParametersRequest();
System.out.println(stub.NoParameters(req));
} catch(Exception e){
e.printStackTrace();
System.out.println("\n\n\n");
}
}
public static void multipleParameters(Axis2UserGuideServiceStub stub){
try{
MultipleParametersAddItemRequest req =
new MultipleParametersAddItemRequest();
req.setPrice((float)1.99);
req.setItemId((int)23872983);
req.setDescription("Must have for cooking");
req.setItemName("flour");
MultipleParametersAddItemResponse res =
stub.MultipleParametersAddItem(req);
System.out.println(res.getItemId());
System.out.println(res.getSuccessfulAdd());
} catch(Exception e){
e.printStackTrace();
System.out.println("\n\n\n");
}
}
}</pre>
<p>Now it's time to compile the client. For the generated files to be found,
they need to be in the source directory, so copy the org file to the src
directory.</p>
<p>Compile the first set of classes by typing: <code>ant jar.client</code></p>
<p>This action compiles most of the available classes, but not everything.
Fortunately, it does compile the classes needed by the JiBX compiler, so you
can now generate the actual JiBX resources. Change to the build/classes
directory and run the JiBX compiler:</p>
<pre>java -jar C:\apps\axis2\lib\jibx-bind.jar ..\..\org\apache\axis2\axis2userguide\binding.xml</pre>
<p>Now that you have the new files in place, re-run the Ant task to generate
the client: <code>ant jar.client</code></p>
<p>This action adds all the appropriate files to the
build/lib/Axis2UserGuideService-test-client.jar file, so add that .jar file
to your CLASSPATH and run the client by typing: java
org.apache.axis2.axis2userguide.Client</p>
</body>
</html>