<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia Site Renderer 1.9.2 at 2021-08-01 
 | Rendered using Apache Maven Fluido Skin 1.6
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="Date-Revision-yyyymmdd" content="20210801" />
    <meta http-equiv="Content-Language" content="en" />
    <title>Apache Axis2 &#x2013; Migrating from Axis 1.x</title>
    <link rel="stylesheet" href="../css/apache-maven-fluido-1.6.min.css" />
    <link rel="stylesheet" href="../css/site.css" />
    <link rel="stylesheet" href="../css/print.css" media="print" />
      <script type="text/javascript" src="../js/apache-maven-fluido-1.6.min.js"></script>
<meta name="generator" content="HTML Tidy for Windows (vers 14 June 2007), see www.w3.org" /><meta http-equiv="content-type" content="" />      </head>
    <body class="topBarDisabled">
      <div class="container-fluid">
      <div id="banner">
        <div class="pull-left"><a href="http://www.apache.org/" id="bannerLeft"><img src="http://www.apache.org/images/asf_logo_wide.png"  alt="Apache Axis2"/></a></div>
        <div class="pull-right"><a href=".././" id="bannerRight"><img src="../images/axis.jpg" /></a></div>
        <div class="clear"><hr/></div>
      </div>

      <div id="breadcrumbs">
        <ul class="breadcrumb">
        <li id="publishDate">Last Published: 2021-08-01<span class="divider">|</span>
</li>
          <li id="projectVersion">Version: 1.8.0<span class="divider">|</span></li>
        <li class=""><a href="http://www.apache.org" class="externalLink" title="Apache">Apache</a><span class="divider">/</span></li>
      <li class=""><a href="../index.html" title="Axis2/Java">Axis2/Java</a><span class="divider">/</span></li>
    <li class="active ">Migrating from Axis 1.x</li>
        </ul>
      </div>
      <div class="row-fluid">
        <div id="leftColumn" class="span2">
          <div class="well sidebar-nav">
<ul class="nav nav-list">
          <li class="nav-header">Axis2/Java</li>
    <li><a href="../index.html" title="Home"><span class="none"></span>Home</a>  </li>
    <li><a href="../download.html" title="Downloads"><span class="none"></span>Downloads</a>  </li>
    <li><a href="javascript:void(0)" title="Release Notes"><span class="icon-chevron-down"></span>Release Notes</a>
      <ul class="nav nav-list">
    <li><a href="../release-notes/1.6.1.html" title="1.6.1"><span class="none"></span>1.6.1</a>  </li>
    <li><a href="../release-notes/1.6.2.html" title="1.6.2"><span class="none"></span>1.6.2</a>  </li>
    <li><a href="../release-notes/1.6.3.html" title="1.6.3"><span class="none"></span>1.6.3</a>  </li>
    <li><a href="../release-notes/1.6.4.html" title="1.6.4"><span class="none"></span>1.6.4</a>  </li>
    <li><a href="../release-notes/1.7.0.html" title="1.7.0"><span class="none"></span>1.7.0</a>  </li>
    <li><a href="../release-notes/1.8.0.html" title="1.8.0"><span class="none"></span>1.8.0</a>  </li>
      </ul>
  </li>
    <li><a href="../modules/index.html" title="Modules"><span class="none"></span>Modules</a>  </li>
    <li><a href="../tools/index.html" title="Tools"><span class="none"></span>Tools</a>  </li>
          <li class="nav-header">Documentation</li>
    <li><a href="../docs/toc.html" title="Table of Contents"><span class="none"></span>Table of Contents</a>  </li>
    <li><a href="../docs/installationguide.html" title="Installation Guide"><span class="none"></span>Installation Guide</a>  </li>
    <li><a href="../docs/quickstartguide.html" title="QuickStart Guide"><span class="none"></span>QuickStart Guide</a>  </li>
    <li><a href="../docs/userguide.html" title="User Guide"><span class="none"></span>User Guide</a>  </li>
    <li><a href="../docs/jaxws-guide.html" title="JAXWS Guide"><span class="none"></span>JAXWS Guide</a>  </li>
    <li><a href="../docs/pojoguide.html" title="POJO Guide"><span class="none"></span>POJO Guide</a>  </li>
    <li><a href="../docs/spring.html" title="Spring Guide"><span class="none"></span>Spring Guide</a>  </li>
    <li><a href="../docs/webadminguide.html" title="Web Administrator's Guide"><span class="none"></span>Web Administrator's Guide</a>  </li>
    <li class="active"><a href="#"><span class="none"></span>Migration Guide (from Axis1)</a>
  </li>
          <li class="nav-header">Resources</li>
    <li><a href="../faq.html" title="FAQ"><span class="none"></span>FAQ</a>  </li>
    <li><a href="../articles.html" title="Articles"><span class="none"></span>Articles</a>  </li>
    <li><a href="http://wiki.apache.org/ws/FrontPage/Axis2/" class="externalLink" title="Wiki"><span class="none"></span>Wiki</a>  </li>
    <li><a href="../refLib.html" title="Reference Library"><span class="none"></span>Reference Library</a>  </li>
    <li><a href="../apidocs/index.html" title="Online Java Docs"><span class="none"></span>Online Java Docs</a>  </li>
          <li class="nav-header">Get Involved</li>
    <li><a href="../overview.html" title="Overview"><span class="none"></span>Overview</a>  </li>
    <li><a href="../git.html" title="Checkout the Source"><span class="none"></span>Checkout the Source</a>  </li>
    <li><a href="../mail-lists.html" title="Mailing Lists"><span class="none"></span>Mailing Lists</a>  </li>
    <li><a href="../release-process.html" title="Release Process"><span class="none"></span>Release Process</a>  </li>
    <li><a href="../guidelines.html" title="Developer Guidelines"><span class="none"></span>Developer Guidelines</a>  </li>
    <li><a href="../siteHowTo.html" title="Build the Site"><span class="none"></span>Build the Site</a>  </li>
          <li class="nav-header">Project Information</li>
    <li><a href="../team-list.html" title="Project Team"><span class="none"></span>Project Team</a>  </li>
    <li><a href="../issue-tracking.html" title="Issue Tracking"><span class="none"></span>Issue Tracking</a>  </li>
    <li><a href="https://github.com/apache/axis-axis2-java-core/" class="externalLink" title="Source Code"><span class="none"></span>Source Code</a>  </li>
    <li><a href="../thanks.html" title="Acknowledgements"><span class="none"></span>Acknowledgements</a>  </li>
          <li class="nav-header">Apache</li>
    <li><a href="http://www.apache.org/licenses/LICENSE-2.0.html" class="externalLink" title="License"><span class="none"></span>License</a>  </li>
    <li><a href="http://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsorship"><span class="none"></span>Sponsorship</a>  </li>
    <li><a href="http://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks"><span class="none"></span>Thanks</a>  </li>
    <li><a href="http://www.apache.org/security/" class="externalLink" title="Security"><span class="none"></span>Security</a>  </li>
  </ul>
          <hr />
          <div id="poweredBy">
              <div class="clear"></div>
              <div class="clear"></div>
              <div class="clear"></div>
              <div class="clear"></div>
  <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="../images/logos/maven-feather.png" /></a>
              </div>
          </div>
        </div>
        <div id="bodyColumn"  class="span10" >
<html xmlns="http://www.w3.org/1999/xhtml">


<h1>Migrating from Apache Axis 1.x to Axis2</h1>

<p>This document is intended for helping Axis 1.x users migrate to
the Axis2 series. We'll begin by listing the improvements in Axis2
in comparison with Axis1. This will be followed by guidelines for
migration to the new version.</p>

<p><i>Send your feedback or questions to: <a class="externalLink" href="mailto:java-user@axis.apache.org?subject=[Axis2]">java-user@axis.apache.org</a></i>.
(Subscription details are available on the <a href="../mail-lists.html">Axis2 site</a>.)
Kindly prefix subject with [Axis2].</p>
<section>
<h2><a name="Content"></a>Content</h2>

<ul>

<li><a href="#comp">Compatibility</a></li>

<li><a href="#start">Getting Started</a></li>

<li><a href="#custom_deployment">Custom Deployment of Services,
Handlers and Modules</a></li>

<li><a href="#transports">Transports for HTTP Connection</a></li>

<li><a href="#data_binding">Data Binding Support</a></li>

<li><a href="#best">Best Usage</a></li>
</ul>
<a name="comp" id="comp"></a>
<section>
<h2><a name="Compatibility"></a>Compatibility</h2>

<p>Axis1.x and Axis2 have evolved from different architectures.</p>

<p><b>Speed</b> - Axis2 is based on the StAX API, which
gives greater speed than the SAX event based parsing used in
Axis1.x.</p>

<p><b>Stability</b> - Axis2 has fixed phases as well as
user-defined phases for extensions. This allows far more stability
as well as flexibility than Axis1.x.</p>

<p><b>Transport framework</b> - Transports (i.e., senders
and listeners for SOAP over various protocols such as HTTP, SMTP,
etc.), have been abstracted away from the Axis2 engine. Having a
transport-independent Axis engine allows far more flexibility in
transport options.</p>

<p><b>WSDL 2.0 support</b> - Axis2 supports both WSDL
versions 1.1 and 2.0, which are used by Axis2's code generation
tools to create web service skeletons and client stubs.</p>

<p><b>Component-oriented architecture</b> - Axis2
components consist of handlers and modules in .mar and .aar
archives. These easily reusable components allow extended
functionality such as pattern processing for your applications or
distribution to partners. Axis2 emphasizes the &quot;Module&quot; concept
over the &quot;Handler&quot; concept of Axis 1.x. Modules contain handlers
that are ordered by phase rules. These are attached to specific
service(s).</p>
<a name="start" id="start"></a>
<section>
<h2><a name="Getting_Started"></a>Getting Started</h2>

<p>Let's look at a simple example of echoing at client API.</p>

<p><b>Axis 1.x</b></p>

<div>
<pre>
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
   
public class TestClient {
  public static void main(String [] args) {
    try {
      String endpoint =&quot;http://ws.apache.org:5049/axis/services/echo&quot;;
      Service  service = new Service();
      Call     call    = (Call) service.createCall();
      call.setTargetEndpointAddress( new java.net.URL(endpoint) );
      call.setOperationName(new QName(&quot;http://soapinterop.org/&quot;, &quot;echoString&quot;));
      String ret = (String) call.invoke( new Object[] { &quot;Hello!&quot; } );
      System.out.println(&quot;Sent 'Hello!', got '&quot; + ret + &quot;'&quot;);
    } catch (Exception e) {
       System.err.println(e.toString());
    }
  }
}
</pre></div>

<p><b>Axis 2</b></p>

<div>
<pre>
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;


public class EchoBlockingClient {
        private static EndpointReference targetEPR = new EndpointReference(
                        &quot;http://127.0.0.1:8080/axis2/services/MyService&quot;);
        public static void main(String[] args) {
                try {
                        OMFactory fac = OMAbstractFactory.getOMFactory();
                        OMNamespace ns = fac.createOMNamespace(&quot;http://soapinterop.org/&quot;, &quot;ns1&quot;);
                        OMElement payload = fac.createOMElement(&quot;echoString&quot;, ns);
                        payload.setText(&quot;Hello!&quot;);
                        Options options = new Options();
                        ServiceClient client = new ServiceClient();
                        options.setTo(targetEPR);
                        client.setOptions(options); 
                        //Blocking invocation
                        OMElement result = client.sendReceive(payload);
                        System.out.println(&quot;Sent Hello, got : &quot; + result.toString());

                } catch (AxisFault axisFault) {
                        axisFault.printStackTrace();
                }

        }
}
</pre></div>

<p>The above code demonstrates that Axis2 service invocations deal
with the SOAP body element itself. The simple shows a synchronous
invocation, but Axis2 can handle asynchronous invocations as well.
The &quot;payload&quot; variable above contains the SOAP body element which
will go in the SOAP envelope.</p>

<p>Once the service is called by the client stub in Axis2, the
&quot;payload&quot; will be bound according to the data binding framework in
use. So the extra work of parsing the &quot;payload&quot; will vanish.</p>

<p>Axis2 supports asynchronous invocation through
sendReceiveNonblocking(). Synchronous/Asynchronous invocations can
handle both single and double HTTP connections.</p>

<p>With this advanced architecture, Axis2 is capable of handling
megabytes of requests and responses, well above the capabilities of
Axis1.x.</p>
<a name="custom_deployment" id="custom_deployment"></a>
<section>
<h2><a name="Custom_Deployment_of_Services.2C_Handlers.2C_and_Modules"></a>Custom Deployment of Services, Handlers, and Modules</h2>

<p>In Axis 1.x, the deployment of services was via the rather
cumbersome WSDD. Service deployment in Axis2 is straightforward and
dynamic using the web-based Axis2 Admin application. Deployment is
just a matter of creating the service archive (.aar) file and
deploying it. More details regarding this is given in the Axis2
user guide.</p>

<p>Axis2 has moved away from the &quot;Handler concept&quot; and is more into
the &quot;Module concept&quot;. Abstractly speaking, the module concept is a
collection of handlers with rules that govern which modules are
created as .mar files. It uses a module.xml file to specify handler
configuration and activation.</p>

<p>When a service is called through a handler, it is just a matter
of giving a reference to the module that includes the handler in
the services.xml (using &lt;module ref=&quot;foo/&gt;&quot;).</p>

<p>Services are hot deployable in Axis2, but modules are not. This
is one feature which is unique to Axis2.</p>

<p>Let's take a detailed look at what it takes to migrate the Axis
1.x handlers to the Axis 2 modules via the &quot;SOAP Monitor&quot;. The SOAP
monitor is really a combination of three components: An applet
which displays responses/requests, a servlet which binds to a
default port of 5001 and connects to the applet, and a handler
chain used to intercept the SOAP messages. Here we'll focus on the
handler.</p>

<p><b>Axis 1.x required two WSDD's to use the SOAP Monitor. First,
the SOAP Monitor Handler itself:</b></p>

<div>
<pre>
&lt;deployment xmlns=&quot;http://xml.apache.org/axis/wsdd/&quot;
    xmlns:java=&quot;http://xml.apache.org/axis/wsdd/providers/java&quot;&gt;
    
  &lt;handler name=&quot;soapmonitor&quot; 
      type=&quot;java:org.apache.axis.handlers.SOAPMonitorHandler&quot;&gt;
    &lt;parameter name=&quot;wsdlURL&quot; 
      value=&quot;/wzs/SOAPMonitorService-impl.wsdl&quot;/&gt;
    &lt;parameter name=&quot;namespace&quot; 
      value=&quot;http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl&quot;/&gt;
    &lt;parameter name=&quot;serviceName&quot; value=&quot;SOAPMonitorService&quot;/&gt;
    &lt;parameter name=&quot;portName&quot; value=&quot;Demo&quot;/&gt;
  &lt;/handler&gt;

  &lt;service name=&quot;SOAPMonitorService&quot; provider=&quot;java:RPC&quot;&gt;
    &lt;parameter name=&quot;allowedMethods&quot; value=&quot;publishMessage&quot;/&gt;
    &lt;parameter name=&quot;className&quot; 
      value=&quot;org.apache.axis.monitor.SOAPMonitorService&quot;/&gt;
    &lt;parameter name=&quot;scope&quot; value=&quot;Application&quot;/&gt;
  &lt;/service&gt;
&lt;/deployment&gt;
</pre></div>

<p><b>Axis 1.x requires a reference to the handler in the user's
WSDD that defines their Web Service:</b></p>

<div>
<pre>
&lt;deployment name=&quot;example&quot; xmlns=&quot;http://xml.apache.org/axis/wsdd/&quot; 
    xmlns:java=&quot;http://xml.apache.org/axis/wsdd/providers/java&quot;&gt;
  
  &lt;service name=&quot;urn:myService&quot; provider=&quot;java:RPC&quot;&gt;
    &lt;parameter name=&quot;className&quot; value=&quot;org.MyService&quot;/&gt;
    &lt;parameter name=&quot;allowedMethods&quot; value=&quot;*&quot;/&gt;

    &lt;requestFlow&gt;
      &lt;handler type=&quot;soapmonitor&quot;/&gt;
    &lt;/requestFlow&gt;
    &lt;responseFlow&gt;
      &lt;handler type=&quot;soapmonitor&quot;/&gt;
    &lt;/responseFlow&gt;

  &lt;/service&gt;
&lt;/deployment&gt;
</pre></div>

<p><b>Axis 2 requires a module.xml, placed inside a jar with a .mar
extension under WEB-INF/modules, to define a Handler:</b></p>

<div>
<pre>
&lt;module name=&quot;soapmonitor&quot; class=&quot;org.apache.axis2.handlers.soapmonitor.SOAPMonitorModule&quot;&gt;
    &lt;inflow&gt;
        &lt;handler name=&quot;InFlowSOAPMonitorHandler&quot; class=&quot;org.apache.axis2.handlers.soapmonitor.SOAPMonitorHandler&quot;&gt;
            &lt;order phase=&quot;soapmonitorPhase&quot;/&gt;
        &lt;/handler&gt;
    &lt;/inflow&gt;

    &lt;outflow&gt;
        &lt;handler name=&quot;OutFlowSOAPMonitorHandler&quot; class=&quot;org.apache.axis2.handlers.soapmonitor.SOAPMonitorHandler&quot;&gt;
            &lt;order phase=&quot;soapmonitorPhase&quot;/&gt;
        &lt;/handler&gt;
    &lt;/outflow&gt;

    &lt;Outfaultflow&gt;
        &lt;handler name=&quot;FaultOutFlowSOAPMonitorHandler&quot; class=&quot;org.apache.axis2.handlers.soapmonitor.SOAPMonitorHandler&quot;&gt;
            &lt;order phase=&quot;soapmonitorPhase&quot;/&gt;
        &lt;/handler&gt;
    &lt;/Outfaultflow&gt;

    &lt;INfaultflow&gt;
        &lt;handler name=&quot;FaultInFlowSOAPMonitorHandler&quot; class=&quot;org.apache.axis2.handlers.soapmonitor.SOAPMonitorHandler&quot;&gt;
            &lt;order phase=&quot;soapmonitorPhase&quot;/&gt;
        &lt;/handler&gt;
    &lt;/INfaultflow&gt;
&lt;/module&gt;
</pre></div>

<p>The SOAPMonitorModule referenced above simply implements the
org.apache.axis2.modules.Module, and is used for any additional
tasks needed to initialize the module and shutdown the module. In
this situation, nothing is needed and the implemented interface
methods have blank bodies. Furthermore, the 'soapmonitorPhase' will
be used later (below) in the axis2.xml .</p>

<p><b>Axis 1.x the SOAPMonitorHandler has the class signature
as:</b></p>

<div>
<pre>
public class SOAPMonitorHandler extends BasicHandler
</pre></div>

<p><b>Axis 2 the SOAPMonitorHandler has the class signature
as:</b></p>

<div>
<pre>
public class SOAPMonitorHandler extends AbstractHandler 
</pre></div>

<p><b>In Axis2, you need to reference the module that contains the
handler chain that you want to use inside your
services.xml:</b></p>

<div>
<pre>
&lt;service name=&quot;ExampleService&quot;&gt;
    &lt;module ref=&quot;soapmonitor&quot;/&gt;
    &lt;description&gt;
       This service has the SOAP Monitor wired in 
    &lt;/description&gt;
    &lt;parameter name=&quot;ServiceClass&quot;&gt;org.ExampleService&lt;/parameter&gt;
    &lt;operation name=&quot;myExecute&quot;&gt;
        &lt;messageReceiver class=&quot;org.apache.axis2.receivers.RawXMLINOutMessageReceiver&quot;/&gt;
    &lt;/operation&gt;
&lt;/service&gt;
</pre></div>

<p><b>Finally, Axis2 requires you to make some changes to
axis2.xml. Start by adding a global module:</b></p>

<div>
<pre>
    &lt;module ref=&quot;soapmonitor&quot;/&gt;
</pre></div>

<p><b>Then define your phase orders for the 'soapmonitorPhase'
referenced in the module.xml :</b></p>

<div>
<pre>
    &lt;phaseOrder type=&quot;inflow&quot;&gt;
        &lt;!--  Global Phases       --&gt;
        &lt;phase name=&quot;TransportIn&quot;/&gt;
        &lt;phase name=&quot;PreDispatch&quot;/&gt;
        &lt;phase name=&quot;Dispatch&quot; class=&quot;org.apache.axis2.engine.DispatchPhase&quot;&gt;
            &lt;handler name=&quot;AddressingBasedDispatcher&quot;
                     class=&quot;org.apache.axis2.dispatchers.AddressingBasedDispatcher&quot;&gt;
                &lt;order phase=&quot;Dispatch&quot;/&gt;
            &lt;/handler&gt;

            &lt;handler name=&quot;RequestURIBasedDispatcher&quot;
                     class=&quot;org.apache.axis2.dispatchers.RequestURIBasedDispatcher&quot;&gt;
                &lt;order phase=&quot;Dispatch&quot;/&gt;
            &lt;/handler&gt;

            &lt;handler name=&quot;SOAPActionBasedDispatcher&quot;
                     class=&quot;org.apache.axis2.dispatchers.SOAPActionBasedDispatcher&quot;&gt;
                &lt;order phase=&quot;Dispatch&quot;/&gt;
            &lt;/handler&gt;

            &lt;handler name=&quot;SOAPMessageBodyBasedDispatcher&quot;
                     class=&quot;org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher&quot;&gt;
                &lt;order phase=&quot;Dispatch&quot;/&gt;
            &lt;/handler&gt;
            &lt;handler name=&quot;InstanceDispatcher&quot;
                     class=&quot;org.apache.axis2.engine.InstanceDispatcher&quot;&gt;
                &lt;order phase=&quot;Dispatch&quot;/&gt;
            &lt;/handler&gt;
        &lt;/phase&gt;
        &lt;!--    Global Phases     --&gt;
        &lt;!--   After Dispatch phase module author or service author can add any phase he wants      --&gt;
        &lt;phase name=&quot;userphase1&quot;/&gt;
        &lt;phase name=&quot;soapmonitorPhase&quot;/&gt;
    &lt;/phaseOrder&gt;
    &lt;phaseOrder type=&quot;outflow&quot;&gt;
        &lt;!--   user can add his own phases to this area  --&gt;
        &lt;!--   Global phases   --&gt;
        &lt;!--   these phases will run irrespective of the service   --&gt;
        &lt;phase name=&quot;MessageOut&quot;/&gt;
        &lt;phase name=&quot;userphase1&quot;/&gt;
        &lt;phase name=&quot;soapmonitorPhase&quot;/&gt;
        &lt;phase name=&quot;PolicyDetermination&quot;/&gt;
        &lt;!--   Global phases   --&gt;
    &lt;/phaseOrder&gt;
    &lt;phaseOrder type=&quot;INfaultflow&quot;&gt;
        &lt;phase name=&quot;userphase1&quot;/&gt;
        &lt;phase name=&quot;soapmonitorPhase&quot;/&gt;
        &lt;!--   user can add his own phases to this area  --&gt;
    &lt;/phaseOrder&gt;
    &lt;phaseOrder type=&quot;Outfaultflow&quot;&gt;
        &lt;!--   user can add his own phases to this area  --&gt;
        &lt;!--   Global phases   --&gt;
        &lt;phase name=&quot;MessageOut&quot;/&gt;
        &lt;phase name=&quot;userphase1&quot;/&gt;
        &lt;phase name=&quot;soapmonitorPhase&quot;/&gt;
        &lt;phase name=&quot;PolicyDetermination&quot;/&gt;
        &lt;!--   Global phases   --&gt;
    &lt;/phaseOrder&gt;
</pre></div>

<p>See the user guide for more information on Axis2 modules.</p>
<a name="transports" id="transports"></a>
<section>
<h2><a name="Transports_for_HTTP_Connection"></a>Transports for HTTP Connection</h2>

<p>Axis2 comes with the HTTPClient4TransportSender which is based
on Apache Httpcomponents.</p>

<p>It should be noted that axis2.xml should be configured to call
the commons transports in this manner:</p>

<div>
<pre>
...
&lt;transportSender name=&quot;http&quot; class=&quot;org.apache.axis2.transport.http.impl.httpclient4.HTTPClient4TransportSender&quot;&gt; 
   &lt;parameter name=&quot;PROTOCOL&quot;&gt;HTTP/1.1&lt;/parameter&gt;
   &lt;parameter name=&quot;Transfer-Encoding&quot;&gt;chunked&lt;/parameter&gt;
&lt;/transportSender&gt;
...
</pre></div>
<a name="data_binding" id="data_binding"></a>
<section>
<h2><a name="Data_Binding_Support"></a>Data Binding Support</h2>

<p>ADB is used to provide data binding support. In Axis2, XML is
manipulated via AXIOM, which is based on the StAX API. AXIOM
provides full XML schema support. Thus, serialization and
de-serialization of XML is handled in Axis2 via the xml-data
binding framework.</p>

<p>Below is an example of migrating a WSDL based Axis 1.x Web
Service to Axis2.</p>

<p>First, let's take a look at a simple document/literal style WSDL
used in an Axis 1.x Web Service. This example assumes the name
simple.wsdl for the WSDL below:</p>

<div>
<pre>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;definitions name=&quot;SimpleService&quot; targetNamespace=&quot;http://simpleNS&quot; xmlns:tns=&quot;http://simpleNS&quot; 
xmlns=&quot;http://schemas.xmlsoap.org/wsdl/&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; 
xmlns:soap=&quot;http://schemas.xmlsoap.org/wsdl/soap/&quot; xmlns:ns2=&quot;http://simpleNS/types&quot;&gt;
  &lt;types&gt;
    &lt;schema targetNamespace=&quot;http://simpleNS/types&quot; xmlns:tns=&quot;http://simpleNS/types&quot; 
xmlns:soap11-enc=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; 
xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:wsdl=&quot;http://schemas.xmlsoap.org/wsdl/&quot; 
xmlns=&quot;http://www.w3.org/2001/XMLSchema&quot;&gt;
      &lt;import namespace=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;/&gt;
      &lt;element name=&quot;simpleLogin&quot;&gt;
        &lt;complexType&gt;
          &lt;sequence&gt;
            &lt;element name=&quot;user_name&quot; type=&quot;xsd:string&quot;/&gt;
            &lt;element name=&quot;user_password&quot; type=&quot;xsd:string&quot;/&gt;
          &lt;/sequence&gt;
        &lt;/complexType&gt;
      &lt;/element&gt;
      &lt;element name=&quot;simpleLoginResponse&quot;&gt;
        &lt;complexType&gt;
          &lt;sequence&gt;
            &lt;element name=&quot;soap_session_id&quot; type=&quot;xsd:string&quot;/&gt;
            &lt;element name=&quot;web_user_name&quot; type=&quot;xsd:string&quot;/&gt;
          &lt;/sequence&gt;
        &lt;/complexType&gt;
      &lt;/element&gt;
&lt;/schema&gt;&lt;/types&gt;
  &lt;message name=&quot;SimpleEndpoint_simpleLogin&quot;&gt;
     &lt;part name=&quot;parameters&quot; element=&quot;ns2:simpleLogin&quot;/&gt;
  &lt;/message&gt;
  &lt;message name=&quot;SimpleEndpoint_simpleLoginResponse&quot;&gt;
    &lt;part name=&quot;result&quot; element=&quot;ns2:simpleLoginResponse&quot;/&gt;
  &lt;/message&gt;
  &lt;portType name=&quot;SimpleEndpoint&quot;&gt;
    &lt;operation name=&quot;simpleLogin&quot;&gt;
      &lt;input message=&quot;tns:SimpleEndpoint_simpleLogin&quot; name=&quot;SimpleEndpoint_simpleLogin&quot;/&gt;
      &lt;output message=&quot;tns:SimpleEndpoint_simpleLoginResponse&quot; name=&quot;SimpleEndpoint_simpleLoginResponse&quot;/&gt;
    &lt;/operation&gt;
  &lt;/portType&gt;
  &lt;binding name=&quot;SimpleEndpointBinding&quot; type=&quot;tns:SimpleEndpoint&quot;&gt;
    &lt;soap:binding transport=&quot;http://schemas.xmlsoap.org/soap/http&quot; style=&quot;document&quot;/&gt;
    &lt;operation name=&quot;simpleLogin&quot;&gt;
      &lt;soap:operation soapAction=&quot;simpleLogin&quot;/&gt;
      &lt;input name=&quot;SimpleEndpoint_simpleLogin&quot;&gt;
        &lt;soap:body use=&quot;literal&quot;/&gt;
      &lt;/input&gt;
      &lt;output name=&quot;SimpleEndpoint_simpleLoginResponse&quot;&gt;
        &lt;soap:body use=&quot;literal&quot;/&gt;
      &lt;/output&gt;
    &lt;/operation&gt;
  &lt;/binding&gt;
  &lt;service name=&quot;SimpleService&quot;&gt;
    &lt;port name=&quot;SimpleEndpointPort&quot; binding=&quot;tns:SimpleEndpointBinding&quot;&gt;
      &lt;soap:address location=&quot;http://localhost:8080/axis/services/SimpleEndpointPort&quot;/&gt;&lt;/port&gt;&lt;/service&gt;&lt;/definitions&gt;
</pre></div>

<p>The next step is to run WSDL2Java on the wsdl. For axis 1.x,
this example uses the following Ant task:</p>

<div>
<pre>
&lt;target name=&quot;wsdl2java&quot; description=&quot;axis 1.x&quot;&gt;
       &lt;delete dir=&quot;output&quot; /&gt;
       &lt;mkdir dir=&quot;output&quot; /&gt;
       &lt;axis-wsdl2java
         output=&quot;output&quot;
         verbose=&quot;true&quot;
         url=&quot;wsdl/simple.wsdl&quot;
         serverside=&quot;true&quot;
         skeletondeploy=&quot;true&quot;
         nowrapped=&quot;true&quot;&gt;
       &lt;/axis-wsdl2java&gt;
   &lt;/target&gt;
</pre></div>

<p>The Axis 1.x Ant task above takes the simple.wsdl under the
directory 'wsdl' , and from that creates files under the directory
'output'. The files created are shown below:</p>

<div>
<pre>
output/
output/simpleNS
output/simpleNS/types
output/simpleNS/types/SimpleLoginResponse.java
output/simpleNS/types/SimpleLogin.java
output/simpleNS/SimpleEndpoint.java
output/simpleNS/SimpleEndpointBindingStub.java
output/simpleNS/SimpleEndpointBindingSkeleton.java
output/simpleNS/SimpleEndpointBindingImpl.java
output/simpleNS/SimpleService.java
output/simpleNS/SimpleServiceLocator.java
output/simpleNS/deploy.wsdd
output/simpleNS/undeploy.wsdd
</pre></div>

<p>Now let's run WSDL2Java with Axis2. In this example, the only
change to simple.wsdl required for Axis2 is that 'soap:address
location' be changed to:</p>

<div>
<pre>
&lt;soap:address location=&quot;http://localhost:8080/axis2/services/SimpleEndpoint&quot;/&gt;&lt;/port&gt;&lt;/service&gt;&lt;/definitions&gt;
</pre></div>

<p>In Axis2, the default databinding uses ADB. However, XMLBeans,
JiBX and JAXB-RI are also supported. This example uses XMLBeans. For
Axis2, our example uses the following Ant task:</p>

<div>
<pre>
&lt;target name=&quot;wsdl2java&quot;&gt;
      &lt;delete dir=&quot;output&quot; /&gt;
      &lt;java classname=&quot;org.apache.axis2.wsdl.WSDL2Java&quot; fork=&quot;true&quot;&gt;
          &lt;classpath refid=&quot;axis.classpath&quot;/&gt; 
          &lt;arg value=&quot;-d&quot;/&gt;
          &lt;arg value=&quot;xmlbeans&quot;/&gt;
          &lt;arg value=&quot;-uri&quot;/&gt;
          &lt;arg file=&quot;wsdl/simple.wsdl&quot;/&gt;
          &lt;arg value=&quot;-ss&quot;/&gt;
          &lt;arg value=&quot;-g&quot;/&gt;
          &lt;arg value=&quot;-sd&quot;/&gt;
          &lt;arg value=&quot;-o&quot;/&gt;
          &lt;arg file=&quot;output&quot;/&gt;
          &lt;arg value=&quot;-p&quot;/&gt;
          &lt;arg value=&quot;org.simple.endpoint&quot;/&gt;
      &lt;/java&gt;

      &lt;!-- Move the schema folder to classpath--&gt;
      &lt;move todir=&quot;${build.classes}&quot;&gt;
          &lt;fileset dir=&quot;output/resources&quot;&gt;
              &lt;include name=&quot;*schema*/**/*.class&quot;/&gt;
              &lt;include name=&quot;*schema*/**/*.xsb&quot;/&gt;
          &lt;/fileset&gt;
      &lt;/move&gt;

  &lt;/target&gt;
</pre></div>

<p>For an explanation of the Axis2 WSDL2Java Ant task and its
options, see the <a href="../tools/CodegenToolReference.html">CodegenToolReference
Guide.</a></p>

<p>A feature of XMLBeans is that there is one class file created
with WSDL2java, and a series of .xsb files. They must be referenced
when compiling, and as the example shows, these files are moved to
a build directory.</p>

<p>The Axis2 WSDL2Java example also takes the simple.wsdl, which is
under the directory 'wsdl', and creates files under the directory
'output'. The relevant non-xmlbean files created are shown
below:</p>

<div>
<pre>
output/resources/services.xml
output/src/org/simple
output/src/org/simple/endpoint
output/src/org/simple/endpoint/SimpleEndpointSkeleton.java
output/src/org/simple/endpoint/SimpleEndpointMessageReceiverInOut.java
output/src/org/simple/endpoint/SimpleEndpointCallbackHandler.java
output/src/org/simple/endpoint/SimpleEndpointStub.java
output/src/simplens
output/src/simplens/types
output/src/simplens/types/SimpleLoginDocument.java
output/src/simplens/types/impl
output/src/simplens/types/impl/SimpleLoginDocumentImpl.java
output/src/simplens/types/impl/SimpleLoginResponseDocumentImpl.java
output/src/simplens/types/SimpleLoginResponseDocument.java
</pre></div>

<p>The first important distinction is that while the Axis 1.x
example generated deploy.wsdd and undeploy.wsdd, the Axis2 example
created a services.xml. The files deploy.wsdd and services.xml are
a breed apart, coming from different architectures. There is no
direct parallel between them. See the Axis2 user guide for an
explanation about services.xml</p>

<p>Now we're ready to code. We'll start with Axis 1.x on the
service side. To implement the business logic, we'll change
simpleNS/SimpleEndpointBindingImpl.java from:</p>

<div>
<pre class="code">
package simpleNS;

public class SimpleEndpointBindingImpl implements simpleNS.SimpleEndpoint{
    public simpleNS.types.SimpleLoginResponse simpleLogin(simpleNS.types.SimpleLogin parameters) 
        throws java.rmi.RemoteException {
        return null;
    }

}
</pre></div>

<p>To:</p>

<div>
<pre class="code">
package simpleNS;

public class SimpleEndpointBindingImpl implements simpleNS.SimpleEndpoint{
    public simpleNS.types.SimpleLoginResponse simpleLogin(simpleNS.types.SimpleLogin parameters) 
        throws java.rmi.RemoteException {

        String userName = parameters.getUser_name();
        String password = parameters.getUser_password();
        // do something with those vars...
        return new simpleNS.types.SimpleLoginResponse(&quot;mySessionID&quot;, &quot;username&quot;);
    }

}
</pre></div>

<p>In Axis 1.x, the next step is to compile the classes and put
them in the Axis.war, and then run the admin client with the
generated deploy.wsdd. You then look at the happy axis page to
verify that the service has been installed correctly.</p>

<p>Now let's code Axis2. In Axis 1.x, while the Ant task shown in
the example created a skeleton, a peek inside shows that the
skeleton calls the binding implementation class. In Axis2, we work
with the skeleton directly. To implement the business logic in the
generated Axis2 classes, we'll change
org/simple/endpoint/SimpleEndpointSkeleton.java from:</p>

<div>
<pre class="code">
package org.simple.endpoint;
    /**
     *  SimpleEndpointSkeleton java skeleton for the axisService
     */
    public class SimpleEndpointSkeleton {

        /**
         * Auto generated method signature
          * @param param0
         */
        public  simplens.types.SimpleLoginResponseDocument simpleLogin
                  (simplens.types.SimpleLoginDocument param0 ) throws Exception {
                //Todo fill this with the necessary business logic
                throw new  java.lang.UnsupportedOperationException();
        }
}
</pre></div>

<p>To:</p>

<div>
<pre class="code">
package org.simple.endpoint;
    
    import simplens.types.*;
    import simplens.types.SimpleLoginResponseDocument.*;
    import simplens.types.SimpleLoginDocument.*;
    /**
     *  SimpleEndpointSkeleton java skeleton for the axisService
     */
    public class SimpleEndpointSkeleton {
     
        /**
         * Modified 
          * @param simpleLoginDocument
         */
        public SimpleLoginResponseDocument simpleLogin
                  (simplens.types.SimpleLoginDocument simpleLoginDocument){
  
                SimpleLoginResponseDocument retDoc =
                    SimpleLoginResponseDocument.Factory.newInstance();
                 
                SimpleLoginResponse retElement =
                    SimpleLoginResponse.Factory.newInstance();
  
                // Get parameters passed in 
                SimpleLogin simpleLogin = simpleLoginDocument.getSimpleLogin();
                String userName = simpleLogin.getUserName();
                String password = simpleLogin.getUserPassword();

                // do something with those variables...

                retElement.setWebUserName(userName);
                retElement.setSoapSessionId(&quot;my random string&quot;);
                retDoc.setSimpleLoginResponse(retElement);
                return retDoc; 
        }
}
</pre></div>

<p>In Axis2, the next step is to compile the classes, put them
along with the generated services.xml in an AAR, and then hot
deploy the AAR by placing it in the Axis2.war under
WEB-INF/services. Point a browser to
http://localhost:8080/axis2/listServices, and you should see the
service 'SimpleService' ready for action. See the Axis2 user guide
for more info.</p>

<p>The last step is constructing the client. Our Axis 1.x client
for this example is:</p>

<div>
<pre>
package org;

import simpleNS.*;
import simpleNS.types.*;

public class Tester {
  public static void main(String [] args) throws Exception {
    // Make a service
    SimpleService service = new SimpleServiceLocator();

    // Now use the service to get a stub which implements the SDI.
    SimpleEndpoint port =  service.getSimpleEndpointPort();

    // set the params
    SimpleLogin parameters = new SimpleLogin(&quot;username&quot;,&quot;password&quot;);
    // Make the actual call
    SimpleLoginResponse simpleLoginResponse = port.simpleLogin(parameters);
    String session = simpleLoginResponse.getSoap_session_id();
    String user = simpleLoginResponse.getWeb_user_name();
    System.out.println(&quot;simpleLoginResponse, session: &quot; + session + &quot;, user: &quot; + user);
  }
}
</pre></div>

<p>Finally, our Axis2 client for this example is:</p>

<div>
<pre>
package org;
import simplens.types.*;
import simplens.types.SimpleLoginDocument.*;
import simplens.types.SimpleLoginResponseDocument.*;
import simplens.types.impl.*;
import org.simple.endpoint.*;

public class Tester {
  public static void main(String [] args) throws Exception {

    // you may not need to pass in the url to the constructor - try the default no arg one
    SimpleEndpointStub stub =
         new SimpleEndpointStub(null, &quot;http://localhost:8080/axis2/services/SimpleService&quot;);

    SimpleLogin simpleLogin = SimpleLogin.Factory.newInstance();
    simpleLogin.setUserName(&quot;userName&quot;);
    simpleLogin.setUserPassword(&quot;password&quot;);

    SimpleLoginDocument simpleLoginDocument =
        SimpleLoginDocument.Factory.newInstance();

    simpleLoginDocument.setSimpleLogin(simpleLogin);

    SimpleLoginResponseDocument simpleLoginResponseDocument
        = stub.simpleLogin(simpleLoginDocument);

    SimpleLoginResponse simpleLoginResponse =
        simpleLoginResponseDocument.getSimpleLoginResponse();

    String session = simpleLoginResponse.getSoapSessionId();
    String user = simpleLoginResponse.getWebUserName();
    System.out.println(&quot;simpleLoginResponse, session: &quot; + session + &quot;, user: &quot; + user);

  }
}
</pre></div>

<p>Axis2 clients also have asynchronous options via a Callback and
alternatively a 'Fire and forget'. See the user guide for more
details.</p>
<a name="best" id="best"></a>
<section>
<h2><a name="Best_Usage"></a>Best Usage</h2>

<p>Axis1.x and Axis2 have different ways of seeing the SOAP stack.
So the best way to migrate is to follow the <a href="userguide.html">User's Guide</a> and the <a href="Axis2ArchitectureGuide.html">Architecture Guide</a> of Axis2
properly. We are confident you will find Axis2 very straightforward
and more friendly to use than its predecessor.</p>

</html>
        </div>
      </div>
    </div>
    <hr/>
    <footer>
      <div class="container-fluid">
        <div class="row-fluid">
            <p>Copyright &copy;2004&#x2013;2021
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.</p>
        </div>
        </div>
    </footer>
    </body>
</html>
