<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements. See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership. The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License. You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied. See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Windows (vers 14 June 2007), see www.w3.org" />
<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>
<p>JiBX support for Axis2 and Web services in general is continuing
to evolve. This page covers the basics of using JiBX with Axis2 as
of the current release. Check the <a href=
"http://www.sosnoski.com/jibx-wiki/space/axis2-jibx">JiBX Axis2
Wiki page</a> for updated information about using JiBX with
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" id="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" id="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" id="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" id="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" id="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 generally 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 built-in JiBX conversions are
handled automatically, and if all the parameter and return values
in your wrapped WSDL are of these types you don't even need a JiBX
binding definition. This is the one case where the <i>-Ebindingfile
{file}</i> parameter is not needed.</p>
<p>If you're not unwrapping the interface, you must use a JiBX
binding definition and it must include a concrete mapping for each
element used as input or output by any operation.</p>
<a name="coming" id="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 JiBX,
and the <a href=
"http://www.sosnoski.com/jibx-wiki/space/axis2-jibx">JiBX Axis2
Wiki page</a> for updated information about using JiBX with
Axis2.</p>
<h2>References</h2>
<p><a href=
"http://jibx.sourceforge.net/tutorial/binding-tutorial.html">JiBX:
Bindings Tutorial</a></p>
</body>
</html>
