blob: b8ce77ae9d0913ff8eb8873da54082ce4600d003 [file] [log] [blame]
<html>
<head>
<meta http-equiv="content-type" content="">
<title>JiBX Integration with Axis2</title>
<link href="../../css/axis-docs.css" rel="stylesheet" type="text/css" media="all" />
</head>
<body>
<h1>JiBX Integration With Axis2</h1>
<p>This document describes using JiBX data binding with Axis2. JiBX differs from
the other data binding techniques supported by Axis2 in that it allows you to
use your own Java data objects (as opposed to Java data objects generated from a
schema definition). JiBX also provides a nicer form of unwrapped Web services
interface than is supported by the other data binding techniques. On the
downside, JiBX requires more setup than the other data binding techniques - in
particular, you need to come up with a set of data classes and a binding
definition in order to work with JiBX in Axis2.</p>
<h2>Content</h2>
<ul>
<li><a href="#intro">Introduction</a></li>
<li><a href="#wrapped">Wrapped vs. unwrapped</a></li>
<li><a href="#java">Starting from Java</a></li>
<li><a href="#wsdl">Starting from WSDL</a></li>
<li><a href="#codegen">Axis2 JiBX Code Generation</a></li>
<li><a href="#coming">Coming Attractions</a></li>
</ul>
<a name="intro"></a>
<h2>Introduction</h2>
<p><a href="http://www.jibx.org">JiBX data binding</a> supports fast and
flexible conversions between plain old Java objects (POJOs) and XML. JiBX
uses a mapped binding approach that's based on binding definition documents
you provide. This approach let's you customize the way your Java objects are
converted to and from XML. You can even define multiple bindings to use the same
Java objects with different XML representations. These features make JiBX
especially useful if you're developing a Web service based on existing Java
code, or when you need to support multiple XML representations for a Web service
(as when you're using versioned schema definitions).</p>
<p>Axis2 supports using JiBX with your Web services, including generating the
necessary linkage code for both client and server sides. However, the Axis2
support for JiBX does not currently include code generation from the schema
for a Web service - you need to provide your own data classes and JiBX
binding definition, and you also need to make sure that the binding
definition matches the XML structures defined for your Web service. The JiBX
project provides some basic tools to help with code generation from schema,
binding generation from Java classes, and schema generation from the
combination of Java classes and a binding definition. In the future, improved
versions of these tools will be integrated directly into the Axis2 framework
support, but for now you're on your own with this part of the setup.</p>
<p>You can use JiBX data binding both to expose existing Java code as a
service, and to build a client for an existing service. This document runs
through the sequence of steps involved for each of these cases, just to help
users understand the basic approach to working with JiBX in Axis2. You can
find full instructions on the standard JiBX parts of this sequence on the <a
href="http://www.jibx.org">JiBX Web site</a>.</p>
<a name="wrapped"></a>
<h2>Wrapped vs. unwrapped</h2>
<p>Axis2 support for JiBX currently only works with the document-literal
(doc/lit) form of Web services definitions. Doc/lit Web services generally use
particular schema elements as input and output from each operation, and the
Axis2 support for JiBX assumes this structure (which is also the structure
required for compatibility with the
<a href="http://www.ws-i.org/Profiles/BasicProfile-1.1.html">WS-I Basic Profile</a>).
</p>
<p>A popular subset of doc/lit Web services use a form called "wrapped". Wrapped
doc/lit Web services define service operations that correspond to method calls,
using input and output element names based on the method name and embedding the
actual parameter values for the method call within the input element.
</p>
<p>When used with Axis2, JiBX supports both general doc/lit and wrapped service
definitions. Wrapped service definitions can be "unwrapped" during code
generation to provide a greatly simplified interface. JiBX unwrapping of service
definitions is not compatible with the unwrapping support for other data binding
frameworks used with Axis2, but most users will find the JiBX approach easy and
convenient. See the <a href="./jibx-unwrapped-example.html">JiBX Unwrapped
Example</a> and the <a href="./jibx-doclit-example.html">JiBX Document/Literal
Example</a> pages for a detailed comparison of the two forms of service
interface.
</p>
<a name="java"></a>
<h2>Starting from Java</h2>
<p>Here's the sequence of steps for using JiBX with Axis2 to expose existing
Java code as a Web service:</p>
<ol>
<li>Create a JiBX binding definition for the data being transferred by the
Web service (you may be able to use the JiBX binding generator to help with
this step).</li>
<li>Create a schema that matches the XML defined by your binding (you may
be able to use the JiBX schema generator to help with this). If you're using
a wrapped form of interface to your service you'll also need to create
schema definitions for the wrapper input and output elements used by each
operation.</li>
<li>Create a WSDL document for your service, with the schema embedded or
imported.</li>
<li>Generate Axis2 server-side linkage code using WSDL2Java with the WSDL
and your binding definition.</li>
<li>Run the JiBX binding compiler on your Java classes to add the actual
binding code.</li>
<li>Include the <i>axis2-jibx.jar</i> in your runtime classpath, along with
the <i>jibx-runtime.jar</i>.</li>
</ol>
<p>If you use a wrapped interface for your Web service you can expose method
calls in your existing code directly as operations in the service. In this case
you normally just use your existing data objects with JiBX data binding, and add
schema definitions for the wrapper elements. See the
<a href="./jibx-unwrapped-example.html">JiBX Unwrapped Example</a> page for more
details on how this works.
</p>
<p>If you use a non-wrapped interface for your Web service you need to define
classes to hold the data input and output from each operation. In this case
these holder classes need to be included in the JiBX binding definition. See the
<a href="./jibx-doclit-example.html">JiBX Document/Literal Example</a> page for
more details on this case.
</p>
<a name="wsdl"></a>
<h2>Starting from WSDL</h2>
<p>Here's the sequence of steps for using JiBX with Axis2 to implement a
client for an existing Web service (or the actual service, when you've been
supplied with the WSDL your service is to implement):</p>
<ol>
<li>Create Java classes for the data being transferred by the Web service,
and a JiBX binding definition that maps these classes to the schema
defined by the Web service (you may be able to use the JiBX xsd2jibx tool
to help with this).</li>
<li>Generate Axis2 client linkage code using WSDL2Java with the WSDL and
your binding definition.</li>
<li>Run the JiBX binding compiler on your Java classes to add the actual
binding code.</li>
<li>Include the <i>axis2-jibx.jar</i> in your runtime classpath, along with
the <i>jibx-runtime.jar</i></li>
</ol>
<p>As with the starting from Java case, there are some differences in the
handling depending on whether your service definition fits the wrapped form. See
the <a href="./jibx-unwrapped-example.html">JiBX Unwrapped Example</a> and
<a href="./jibx-doclit-example.html">JiBX Document/Literal Example</a> pages for
more details.</p>
<a name="codegen"></a>
<h2>WSDL2Java usage</h2>
<p>To run the WSDL2Java tool for JiBX data binding you need:</p>
<ol>
<li>To specify <i>-d jibx</i> to select JiBX binding.</li>
<li>You also need an additional parameter, <i>-Ebindingfile {file}</i>
(where <i>{file}</i> is the file path to your JiBX binding definition).</li>
<li>Finally, you need to have the <i>axis2-jibx-XXXX.jar</i>, the
<i>jibx-bind-XXXX.jar</i>, and the <i>jibx-run-XXXX.jar</i> files
from your Axis2 distribution included in the WSDL2Java classpath.</li>
</ol>
<p>If you want to use the unwrapped form of interface you also need to specify
the <i>-uw</i> option to WSDL2Java. In this case your JiBX binding definition
must include abstact mappings for all the complex objects which correspond to
method parameters, and each abstract mapping must specify a <i>type-name</i>
attribute that matches the schema <i>complexType</i> used in the WSDL. You can
also use formats in the binding definition to define the handling of schema
<i>simpleType</i>s. Schema types corresponding to Java primitives and simple
objects with build-in JiBX conversions are handled automatically.</p>
<p>If you're not unwrapping the interface, your JiBX binding definition must
include a concrete mapping for each element used as input or output by any
operation.</p>
<a name="coming"></a>
<h2>Coming Attractions</h2>
<p>Work is in-progress on better tools to support generating Java classes and
corresponding JiBX binding definitions from an input schema, and also for
generating binding+schema generation from existing code. These features will be
integrated into the Axis2 JiBX support when they are available. Check the <a
href="http://www.jibx.org">JiBX project site</a> for updates on both JiBX
and the Axis2 JiBX support.</p>
<h2>References</h2>
<p><a href="http://jibx.sourceforge.net/tutorial/binding-tutorial.html">JiBX:
Bindings Tutorial</a>
</p>
</body>
</html>