<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia Site Renderer 1.7.4 at 2018-05-19 
 | 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="20180519" />
    <meta http-equiv="Content-Language" content="en" />
    <title>Apache Axis2 &#x2013; JAX-WS Guide</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>
      </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: 2018-05-19<span class="divider">|</span>
</li>
          <li id="projectVersion">Version: 1.7.8<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 ">JAX-WS Guide</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.7.1.html" title="1.7.1"><span class="none"></span>1.7.1</a>  </li>
    <li><a href="../release-notes/1.7.2.html" title="1.7.2"><span class="none"></span>1.7.2</a>  </li>
    <li><a href="../release-notes/1.7.3.html" title="1.7.3"><span class="none"></span>1.7.3</a>  </li>
    <li><a href="../release-notes/1.7.4.html" title="1.7.4"><span class="none"></span>1.7.4</a>  </li>
    <li><a href="../release-notes/1.7.5.html" title="1.7.5"><span class="none"></span>1.7.5</a>  </li>
    <li><a href="../release-notes/1.7.6.html" title="1.7.6"><span class="none"></span>1.7.6</a>  </li>
    <li><a href="../release-notes/1.7.7.html" title="1.7.7"><span class="none"></span>1.7.7</a>  </li>
    <li><a href="../release-notes/1.7.8.html" title="1.7.8"><span class="none"></span>1.7.8</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 class="active"><a href="#"><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><a href="../docs/migration.html" title="Migration Guide (from Axis1)"><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="../svn.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="http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/" 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>JAX-WS Guide</h1>

  
<div class="section">
<h2><a name="Table_of_Contents"></a>Table of Contents</h2>

  
<ol style="list-style-type: decimal">
    
<li><a href="#JAXWSIntro">Introduction to JAX-WS</a></li>

    
<li><a href="#JAXBIntro">Introduction to JAXB</a></li>

    
<li>
      <a href="#DevelopService">Developing JAX-WS Web services</a>

      
<ol style="list-style-type: decimal">
        
<li><a href="#BottomUpService">From a JavaBean
        (bottom-up)</a></li>

        
<li><a href="#TopDownService">From a WSDL document
        (top-down)</a></li>
      </ol>
    </li>

    
<li>
      <a href="#DeployService">Packaging and deploying a JAX-WS
      service</a>

      
<ol style="list-style-type: decimal">
        
<li><a href="#ProxyClient">Developing a JAX-WS client from
        a WSDL document</a></li>

        
<li><a href="#DispatchClient">Developing a dynamic client
        using JAX-WS APIs</a></li>
      </ol>
    </li>

    
<li><a href="#DevelopClient">Developing JAX-WS clients</a></li>

    
<li><a href="#RunClient">Running a JAX-WS client</a></li>

    
<li><a href="#Async">Invoking JAX-WS Web services
    asynchronously</a></li>

    
<li><a href="#Handlers">Using handlers in JAX-WS Web
    services</a></li>

    
<li><a href="#HTTPSession">Enabling HTTP session management
    support for JAX-WS applications</a></li>

    
<li><a href="#MTOM">Enabling MTOM</a></li>
  </ol>

  
<div class="section">
<h2><a name="Introduction_to__JAX-WS"></a><a name="JAXWSIntro" id="JAXWSIntro">Introduction to
  JAX-WS</a></h2>JAX-WS 2.0 is a new programming model that
  simplifies application development through support of a standard,
  annotation-based model to develop Web Service applications and
  clients. The JAX-WS 2.0 specification strategically aligns itself
  with the current industry trend towards a more document-centric
  messaging model and replaces the remote procedure call
  programming model as defined by JAX-RPC. JAX-WS is the strategic
  programming model for developing Web services and is a required
  part of the Java Platform, Enterprise Edition 5 (Java EE 5). The
  implementation of the JAX-WS programming standard provides the
  following enhancements for developing Web services and clients:

  
<ul>
    
<li>Better platform independence for Java applications.</li>

    
<li style="list-style: none"><br />
    Using JAX-WS APIs, development of Web services and clients is
    simplified with better platform independence for Java
    applications. JAX-WS takes advantage of the dynamic proxy
    mechanism to provide a formal delegation model with a pluggable
    provider. This is an enhancement over JAX-RPC, which relies on
    the generation of vendor-specific stubs for invocation.<br />
    <br /></li>

    
<li>Annotations</li>

    
<li style="list-style: none">
      <br />
      JAX-WS introduces support for annotating Java classes with
      metadata to indicate that the Java class is a Web service.
      JAX-WS supports the use of annotations based on the Metadata
      Facility for the Java Programming Language (JSR 175)
      specification, the Web Services Metadata for the Java
      Platform (JSR 181) specification and annotations defined by
      the JAX-WS 2.0 specification. Using annotations within the
      Java source and within the Java class simplifies development
      of Web services by defining some of the additional
      information that is typically obtained from deployment
      descriptor files, WSDL files, or mapping metadata from XML
      and WSDL files into the source artifacts.<br />
      <br />
      For example, you can embed a simple @WebService tag in the
      Java source to expose the bean as a Web service.
      
<div>
<pre>
      @WebService 

      public class QuoteBean implements StockQuote {

             public float getQuote(String sym) { ... }

      }
</pre></div>The <tt>@WebService</tt> annotation tells the server
runtime to expose all public methods on that bean as a Web service.
Additional levels of granularity can be controlled by adding
additional annotations on individual methods or parameters. Using
annotations makes it much easier to expose Java artifacts as Web
services. In addition, as artifacts are created from using some of
the top-down mapping tools starting from a WSDL file, annotations
are included within the source and Java classes as a way of
capturing the metadata along with the source files.<br />
      Using annotations also improves the development of Web
      services within a team structure because you do not need to
      define every Web service in a single or common deployment
      descriptor as required with JAX-RPC Web services. Taking
      advantage of annotations with JAX-WS Web services allows
      parallel development of the service and the required
      metadata.<br />
      <br />
    </li>

    
<li>Invoking Web services asynchronously</li>

    
<li style="list-style: none">
      <br />
      With JAX-WS, Web services are called both synchronously and
      asynchronously. JAX-WS adds support for both a polling and
      callback mechanism when calling Web services asynchronously.
      Using a polling model, a client can issue a request, get a
      response object back, which is polled to determine if the
      server has responded. When the server responds, the actual
      response is retrieved. Using the callback model, the client
      provides a callback handler to accept and process the inbound
      response object. Both the polling and callback models enable
      the client to focus on continuing to process work without
      waiting for a response to return, while providing for a more
      dynamic and efficient model to invoke Web services.<br />
      <br />
      For example, a Web service interface might have methods for
      both synchronous and asynchronous requests. Asynchronous
      requests are identified in bold below:
      
<div>
<pre>
      @WebService
      public interface CreditRatingService {
            // sync operation
            Score      getCreditScore(Customer customer);
            // async operation with polling
            <b>Response&lt;Score&gt;</b> getCreditScoreAsync(Customer customer);
            // async operation with callback
            <b>Future&lt;?&gt;</b> getCreditScoreAsync(Customer customer, 
               <b>AsyncHandler&lt;Score&gt;</b> handler);
      }
</pre></div>The asynchronous invocation that uses the callback mechanism
requires an additional input by the client programmer. The callback
is an object that contains the application code that will be
executed when an asynchronous response is received. The following
is a code example for an asynchronous callback handler:
      
<div>
<pre>
      CreditRatingService svc = ...;

      <b>Future&lt;?&gt;</b> invocation = svc.getCreditScoreAsync(customerFred,
        <b>new AsyncHandler&lt;Score&gt;() {
           public void handleResponse (
               Response&lt;Score&gt; response)
             {
               Score score = response.get();
               // do work here...
             }
         }</b>
      );
</pre></div>The following is a code example for an asynchronous polling
client:
      
<div>
<pre>
      CreditRatingService svc = ...;
      <b>Response&lt;Score&gt; response</b> = svc.getCreditScoreAsync(customerFred);

      while (<b>!response.isDone()</b>) {
                // do something while we wait
      }

      // no cast needed, thanks to generics
      Score score = <b>response.get()</b>;
</pre></div><br />
      <br />
    </li>

    
<li>Using resource injection</li>

    
<li style="list-style: none">JAX-WS supports resource injection
    to further simplify development of Web services. JAX-WS uses
    this key feature of Java EE 5 to shift the burden of creating
    and initializing common resources in a Java runtime environment
    from your Web service application to the application container
    environment itself. JAX-WS provides support for a subset of
    annotations that are defined in JSR-250 for resource injection
    and application lifecycle in its runtime.<br />
      Axis2 supports the JAX-WS usage of the <tt>@Resource</tt>
      annotation for resource injection. The <tt>@Resource</tt>
      annotation is defined by the JSR-250, Common Annotations
      specification that is included in Java Platform, Enterprise
      Edition 5 (Java EE 5). By placing the <tt>@Resource</tt>
      annotation on a service endpoint implementation, you can
      request a resource injection and collect the
      <tt>javax.xml.ws.WebServiceContext</tt> interface related
      to that particular endpoint invocation. When the endpoint
      sees the <tt>@Resource</tt> annotation, the endpoint adds
      the annotated variable with an appropriate value before the
      servlet is placed into service. From the
      <tt>WebServiceContext</tt> interface, you can collect the
      <tt>MessageContext</tt> for the request associated with
      the particular method call using the
      <tt>getMessageContext()</tt> method.<br />
      <br />
      The following example illustrates using the
      <tt>@Resource</tt> annotation for resource injection:
      
<div>
<pre>@WebService
public class MyService {
    
    @Resource
    private WebServiceContext ctx;

    public String echo (String input) {
        &#x2026;
    }
     
}
</pre></div>Refer to sections 5.2.1 and 5.3 of the JAX-WS 2.0
specification for more information on resource injection.<br />

      <br />
    </li>

    
<li>Data binding with Java Architecture for XML Binding (JAXB)
    2.0</li>

    
<li style="list-style: none"><br />
    JAX-WS leverages the JAXB 2.0 API and tools as the binding
    technology for mappings between Java objects and XML documents.
    JAX-WS tooling relies on JAXB tooling for default data binding
    for two-way mappings between Java objects and XML
    documents.<br />
    <br /></li>

    
<li>Dynamic and static clients</li>

    
<li style="list-style: none"><br />
    The dynamic client API for JAX-WS is called the dispatch client
    (<tt>javax.xml.ws.Dispatch</tt>). The dispatch client is an
    XML messaging oriented client. The data is sent in either
    <tt>PAYLOAD</tt> or <tt>MESSAGE</tt> mode. When using
    the <tt>PAYLOAD</tt> mode, the dispatch client is only
    responsible for providing the contents of the &lt;soap:Body&gt;
    and JAX-WS adds the &lt;soap:Envelope&gt; and
    &lt;soap:Header&gt; elements. When using the
    <tt>MESSAGE</tt> mode, the dispatch client is responsible
    for providing the entire SOAP envelope including the
    &lt;soap:Envelope&gt;, &lt;soap:Header&gt;, and
    &lt;soap:Body&gt; elements and JAX-WS does not add anything
    additional to the message. The dispatch client supports
    asynchronous invocations using a callback or polling
    mechanism.<br />
    The static client programming model for JAX-WS is the called
    the proxy client. The proxy client invokes a Web service based
    on a Service Endpoint interface (SEI) which must be
    provided.<br />
    <br /></li>

    
<li>Support for Message Transmission Optimized Mechanism
    (MTOM)</li>

    
<li style="list-style: none"><br />
    Using JAX-WS, you can send binary attachments such as images or
    files along with Web services requests. JAX-WS adds support for
    optimized transmission of binary data as specified by Message
    Transmission Optimization Mechanism (MTOM).<br />
    <br /></li>

    
<li>Multiple data binding technologies</li>

    
<li style="list-style: none"><br />
    JAX-WS exposes the following binding technologies to the end
    user: XML Source, SOAP Attachments API for Java (SAAJ) 1.3, and
    Java Architecture for XML Binding (JAXB) 2.0. XML Source
    enables a user to pass a javax.xml.transform.Source into the
    runtime which represents the data in a Source object to be
    processed. SAAJ 1.3 now has the ability to pass an entire SOAP
    document across the interface rather than just the payload
    itself. This is done by the client passing the SAAJ
    <tt>SOAPMessage</tt> object across the interface. JAX-WS
    leverages the JAXB 2.0 support as the data binding technology
    of choice between Java and XML.<br />
    <br /></li>

    
<li>Support for SOAP 1.2</li>

    
<li style="list-style: none"><br />
    Support for SOAP 1.2 has been added to JAX-WS 2.0. JAX-WS
    supports both SOAP 1.1 and SOAP 1.2 so that you can send binary
    attachments such as images or files along with Web services
    requests. JAX-WS adds support for optimized transmission of
    binary data as specified by MTOM.<br />
    <br /></li>

    
<li>New development tools</li>

    
<li style="list-style: none">
      <br />
      JAX-WS provides the <b>wsgen</b> and <b>wsimport</b>
      command-line tools for generating portable artifacts for
      JAX-WS Web services. When creating JAX-WS Web services, you
      can start with either a WSDL file or an implementation bean
      class. If you start with an implementation bean class, use
      the wsgen command-line tool to generate all the Web services
      server artifacts, including a WSDL file if requested. If you
      start with a WSDL file, use the wsimport command-line tool to
      generate all the Web services artifacts for either the server
      or the client. The wsimport command line tool processes the
      WSDL file with schema definitions to generate the portable
      artifacts, which include the service class, the service
      endpoint interface class, and the JAXB 2.0 classes for the
      corresponding XML schema.

      
<div class="section">
<h2><a name="Introduction_to______JAXB"></a><a name="JAXBIntro" id="JAXBIntro">Introduction to
      JAXB</a></h2>Java Architecture for XML Binding (JAXB) is a
      Java technology that provides an easy and convenient way to
      map Java classes and XML schema for simplified development of
      Web services. JAXB leverages the flexibility of
      platform-neutral XML data in Java applications to bind XML
      schema to Java applications without requiring extensive
      knowledge of XML programming.<br />
      <br />
      Axis2 provides JAXB 2.0 standards.<br />
      <br />
      JAXB is an XML to Java binding technology that supports
      transformation between schema and Java objects and between
      XML instance documents and Java object instances. JAXB
      consists of a runtime application programming interface (API)
      and accompanying tools that simplify access to XML documents.
      JAXB also helps to build XML documents that both conform and
      validate to the XML schema.<br />
      <br />
      JAXB provides the <b>xjc</b> schema compiler tool, the
      <b>schemagen</b> schema generator tool, and a runtime
      framework. You can use the <b>xjc</b> schema compiler tool to
      start with an XML schema definition (XSD) to create a set of
      JavaBeans that map to the elements and types defined in the
      XSD schema. You can also start with a set of JavaBeans and
      use the <b>schemagen</b> schema generator tool to create the
      XML schema. Once the mapping between XML schema and Java
      classes exists, XML instance documents can be converted to
      and from Java objects through the use of the JAXB binding
      runtime API. Data stored in XML documents can be accessed
      without the need to understand the data structure. You can
      then use the resulting Java classes to assemble a Web
      services application.<br />
      <br />
      JAXB annotated classes and artifacts contain all the
      information needed by the JAXB runtime API to process XML
      instance documents. The JAXB runtime API supports marshaling
      of JAXB objects to XML and unmarshaling the XML document back
      to JAXB class instances. Optionally, you can use JAXB to
      provide XML validation to enforce both incoming and outgoing
      XML documents to conform to the XML constraints defined
      within the XML schema.<br />
      <br />
      JAXB is the default data binding technology used by the Java
      API for XML Web Services (JAX-WS) 2.0 tooling and
      implementation within this product. You can develop JAXB
      objects for use within JAX-WS applications.<br />
      <br />
      You can also use JAXB independently of JAX-WS when you want
      to leverage the XML data binding technology to manipulate XML
      within your Java applications.<br />
      <br />
      The following diagram illustrates the JAXB
      architecture.<br />
      <img src="images/JAXB_architecture.gif" width="600" height="301" border="0" alt="" />

      
<div class="section">
<h2><a name="Developing______JAX-WS_Web_services"></a><a name="DevelopService" id="DevelopService">Developing
      JAX-WS Web services</a></h2>

      
<div class="section">
<h3><a name="Developing______a_JAX-WS_Web_service_from_a_JavaBean_bottom-up______development"></a><a name="BottomUpService" id="BottomUpService">Developing
      a JAX-WS Web service from a JavaBean (bottom-up
      development)</a></h3>When developing a JAX-WS Web service
      starting from JavaBeans, you can use a bean that already
      exists and then enable the implementation for JAX-WS Web
      services. The use of annotations simplifies the enabling of a
      bean for Web services. Adding the <tt>@WebService</tt>
      annotation to the bean defines the application as a Web
      service and how a client can access the Web service.
      JavaBeans can have a service endpoint interface, but it is
      not required. Enabling JavaBeans for Web services includes
      annotating the bean and the optional service endpoint
      interface, assembling all artifacts required for the Web
      service, and deploying the application into Axis2. You are
      not required to develop a WSDL file because the use of
      annotations can provide all of the WSDL information necessary
      to configure the service endpoint or the client. It is,
      however, a best practice to develop a WSDL file.<br />
      <br />

      
<ol style="list-style-type: decimal">
        
<li>Develop a service endpoint interface.</li>

        
<li style="list-style: none">
          <br />
          Java API for XML-Based Web Services (JAX-WS) supports two
          different service endpoint implementations types, the
          standard JavaBeans service endpoint interface and a new
          <tt>Provider</tt> interface to enable services to
          work at the XML message level. By using annotations on
          the service endpoint or client, you can define the
          service endpoint as a Web service.<br />
          <br />
          JavaBeans endpoints in JAX-WS are similar to the endpoint
          implementations in the Java API for XML-based RPC
          (JAX-RPC) specification. Unlike JAX-RPC, the requirement
          for a service endpoint interface (SEI) is optional for
          JavaBeans-based services. JAX-WS services that do not
          have an associated SEI are regarded as having an implicit
          SEI, whereas services that have an associated SEI are
          regarded as having an explicit SEI. The service endpoint
          interfaces required by JAX-WS are also more generic than
          the service endpoint interfaces required by JAX-RPC. With
          JAX-WS, the SEI is not required to extend the
          java.rmi.Remote interface as required by the JAX-RPC
          specification.<br />
          <br />
          The JAX-WS programming model also leverages support for
          annotating Java classes with metadata to define a service
          endpoint application as a Web service and define how a
          client can access the Web service. JAX-WS supports
          annotations based on the Metadata Facility for the Java
          Programming Language (JSR 175) specification, the Web
          Services Metadata for the Java Platform (JSR 181)
          specification and annotations defined by the JAX-WS 2.0
          (JSR 224) specification, which includes Java Architecture
          for XML Binding (JAXB) annotations. Using annotations,
          the service endpoint implementation can independently
          describe the Web service without requiring a WSDL file.
          Annotations can provide all of the WSDL information
          necessary to configure your service endpoint
          implementation or Web services client. You can specify
          annotations on the service endpoint interface used by the
          client and the server, or on the server-side service
          implementation class.<br />
          <br />
          To develop a JAX-WS Web service, you must annotate your
          Java class with the <tt>javax.jws.WebService</tt>
          annotation for JavaBeans endpoints or the
          <tt>javax.jws.WebServiceProvider</tt> annotation for
          a Provider endpoint. These annotations define the Java
          class as a Web service endpoint. For a JavaBeans
          endpoint, the service endpoint interface or service
          endpoint implementation is a Java interface or class,
          respectively, that declares the business methods provided
          by a particular Web service. The only methods on a
          JavaBeans endpoint that can be invoked by a Web services
          client are the business methods that are defined in the
          explicit or implicit service endpoint interface.<br />
          <br />
          All JavaBeans endpoints are required to have the
          <tt>@WebService (javax.jws.WebService)</tt>
          annotation included on the bean class. If the service
          implementation bean also uses an SEI, then that endpoint
          interface must be referenced by the endpointInterface
          attribute on that annotation. If the service
          implementation bean does not use an SEI, then the service
          is described by the implicit SEI defined in the
          bean.<br />
          <br />
          The JAX-WS programming model introduces the new Provider
          API, <tt>javax.xml.ws.Provider</tt>, as an
          alternative to service endpoint interfaces. The
          <tt>Provider</tt> interface supports a more messaging
          oriented approach to Web services. With the
          <tt>Provider</tt> interface, you can create a Java
          class that implements a simple interface to produce a
          generic service implementation class. The
          <tt>Provider</tt> interface has one method, the
          invoke method, which uses generics to control both the
          input and output types when working with various messages
          or message payloads. All Provider endpoints must be
          annotated with the <tt>@WebServiceProvider
          (javax.xml.ws.WebServiceProvider)</tt> annotation. A
          service implementation cannot specify the
          <tt>@WebService</tt> annotation if it implements the
          <tt>javax.xml.ws.Provider</tt> interface.<br />
          <br />
          So the steps involved are:

          
<ol style="list-style-type: decimal">
            
<li>Identify your service endpoint requirements for
            your Web services application.</li>

            
<li style="list-style: none">
              <br />
              First determine if the service implementation is a
              JavaBeans endpoint or a Provider endpoint. If you
              choose to use a JavaBeans endpoint, then determine if
              you want to use an explicit SEI or if the bean itself
              will have an implicit SEI.<br />
              A Java class that implements a Web service must
              specify either the <tt>javax.jws.WebService</tt>
              or <tt>javax.xml.ws.WebServiceProvider</tt>
              annotation. Both annotations must not be present on a
              Java class. The
              <tt>javax.xml.ws.WebServiceProvider</tt>
              annotation is only supported on classes that
              implement the <tt>javax.xml.ws.Provider</tt>
              interface.

              
<ul>
                
<li>If you have an explicit service endpoint
                interface with the Java class, then use the
                endpointInterface parameter to specify the service
                endpoint interface class name to the
                <tt>javax.jws.WebService</tt> annotation. You
                can add the <tt>@WebMethod</tt> annotation to
                methods of a service endpoint interface to
                customize the Java-to-WSDL mappings. All public
                methods are considered as exposed methods
                regardless of whether the <tt>@WebMethod</tt>
                annotation is specified or not. It is incorrect to
                have an <tt>@WebMethod</tt> annotation on an
                service endpoint interface that contains the
                <tt>exclude</tt> attribute.</li>

                
<li>If you have an implicit service endpoint
                interface with the Java class, then the
                <tt>javax.jws.WebService</tt> annotation will
                use the default values for the
                <tt>serviceName</tt>, <tt>portName</tt>,
                and <tt>targetNamespace</tt> parameters. To
                override these default values, specify values for
                these parameters in the <tt>@WebService</tt>
                annotation. If the <tt>@WebMethod</tt>
                annotation is not specified, all public methods are
                exposed including the inherited methods with the
                exception of methods inherited from
                <tt>java.lang.Object</tt>. The
                <tt>exclude</tt> parameter of the
                <tt>@WebMethod</tt> annotation can be used to
                control which methods are exposed.</li>

                
<li>If you are using the <tt>Provider</tt>
                interface, use the
                <tt>javax.xml.ws.WebServiceProvider</tt>
                annotation on the Provider endpoint.</li>
              </ul>
            </li>

            
<li>Annotate the service endpoints.</li>

            
<li>Implement your service.</li>
          </ol><br />
          <br />
          When using a bottom-up approach to develop JAX-WS Web
          services, use the wsgen command-line tool when starting
          from a service endpoint implementation. The wsgen tool
          processes a compiled service endpoint implementation
          class as input and generates the following portable
          artifacts:

          
<ul>
            
<li>any additional Java Architecture for XML Binding
            (JAXB) classes that are required to marshal and
            unmarshal the message contents. The additional classes
            include classes that are represented by the
            @RequestWrapper annotation and the
            <tt>@ResponseWrapper</tt> annotation for a wrapped
            method.</li>

            
<li>a WSDL file if the optional <tt>-wsdl</tt>
            argument is specified. The wsgen command does not
            automatically generate the WSDL file. The WSDL file is
            automatically generated when you deploy the service
            endpoint.</li>
          </ul><br />
          You are not required to develop a WSDL file when
          developing JAX-WS Web services using the bottom-up
          approach of starting with JavaBeans. The use of
          annotations provides all of the WSDL information
          necessary to configure the service endpoint or the
          client. Axis2 supports WSDL 1.1 documents that comply
          with Web Services-Interoperability (WS-I) Basic Profile
          1.1 specifications and are either Document/Literal style
          documents or RPC/Literal style documents. Additionally,
          WSDL documents with bindings that declare a USE attribute
          of value <tt>LITERAL</tt> are supported while the
          value, <tt>ENCODED</tt>, is not supported. For WSDL
          documents that implement a Document/Literal wrapped
          pattern, a root element is declared in the XML schema and
          is used as an operation wrapper for a message flow.
          Separate wrapper element definitions exist for both the
          request and the response.<br />
          <br />
          To ensure the wsgen command does not miss inherited
          methods on a service endpoint implementation bean, you
          must either add the <tt>@WebService</tt> annotation
          to the desired superclass or you can override the
          inherited method in the implementation class with a call
          to the superclass method. Implementation classes only
          expose methods from superclasses that are annotated with
          the <tt>@WebService</tt> annotation.<br />
          <br />
          Note: The <b>wsgen</b> command does not differentiate the
          XML namespace between multiple <tt>XMLType</tt>
          annotations that have the same <tt>@XMLType</tt> name
          defined within different Java packages. When this
          scenario occurs, the following error is produced:
          
<div>
<pre>
   Error: Two classes have the same XML type name ....
   Use @XmlType.name and @XmlType.namespace to assign different names to them...
</pre></div>This error indicates you have class names or
<tt>@XMLType.name</tt> values that have the same name, but
exist within different Java packages. To prevent this error, add
the <tt>@XML.Type.namespace</tt> class to the existing <tt>
          @XMLType</tt> annotation to differentiate between the
          XML types.
        </li>

        
<li>Develop the Java artifacts.</li>

        
<li>Package and deploy your service.</li>
      </ol>

      </div>
<div class="section">
<h3><a name="Developing_a______JAX-WS_Web_service_from_a_WSDL_document_top-down______development"></a><a name="TopDownService" id="TopDownService">Developing a
      JAX-WS Web service from a WSDL document (top-down
      development)</a></h3>You can use a top-down development
      approach to create a JAX-WS Web service with an existing WSDL
      file using JavaBeans.<br />
      <br />
      You can use the JAX-WS tool, <b>wsimport</b>, to process a
      WSDL file and generate portable Java artifacts that are used
      to create a Web service. The portable Java artifacts created
      using the <b>wsimport</b> tool are:

      
<ul>
        
<li>Service endpoint interface (SEI)</li>

        
<li>Service class</li>

        
<li>Exception class that is mapped from the
        <tt>wsdl:fault</tt> class (if any)</li>

        
<li>Java Architecture for XML Binding (JAXB) generated type
        values which are Java classes mapped from XML schema
        types</li>
      </ul><br />
      Run the
      
<div>
<pre>
wsimport -keep -verbose <i>wsdl_URL</i>
</pre></div>command to generate the portable artifacts. The
<tt>-keep</tt> option tells the tool not to delete the
generated files, and the <tt>-verbose</tt> option tells it to
list the files that were created. The ObjectFactory.java file that
is created contains factory methods for each Java content interface
and Java element interface generated in the associated package. The
package-info.java file takes the <tt>targetNamespace</tt> value
and creates the directory structure.<br />
      <br />
      You must now provide an implementation for the SEI created by
      the tool.

      </div>
<div class="section">
<h2><a name="Packaging_and______deploying_a_JAX-WS_service"></a><a name="DeployService" id="DeployService">Packaging and
      deploying a JAX-WS service</a></h2>Axis2 provides two
      mechanisms for deploying JAX-WS services:

      
<ol style="list-style-type: decimal">
        
<li>The service may be packaged and deployed as an AAR,
        just like any other service within Axis2. Like with all
        AARs, a services.xml file containing the relevant metadata
        is required for the service to deploy correctly.</li>

        
<li>The service may be packaged in a jar file and placed
        into the <tt>servicejars</tt> directory. The
        <tt>JAXWSDeployer</tt> will examine all jars within
        that directory and deploy those classes that have JAX-WS
        annotations which identify them as Web services.</li>
      </ol>

      
<div class="section">
<h2><a name="Developing______JAX-WS_clients"></a><a name="DevelopClient" id="DevelopClient">Developing
      JAX-WS clients</a></h2>The Java API for XML-Based Web
      Services (JAX-WS) Web service client programming model
      supports both the Dispatch client API and the Dynamic Proxy
      client API. The Dispatch client API is a dynamic client
      programming model, whereas the static client programming
      model for JAX-WS is the Dynamic Proxy client. The Dispatch
      and Dynamic Proxy clients enable both synchronous and
      asynchronous invocation of JAX-WS Web services.<br />
      <br />

      
<ul>
        
<li>Dispatch client: Use this client when you want to work
        at the XML message level or when you want to work without
        any generated artifacts at the JAX-WS level.</li>

        
<li>Dynamic Proxy client: Use this client when you want to
        invoke a Web service based on a service endpoint
        interface.</li>
      </ul>

      
<div class="section">
<div class="section">
<h4><a name="Dispatch_client"></a>Dispatch client</h4>XML-based Web services use XML
      messages for communications between Web services and Web
      services clients. The JAX-WS APIs provide high-level methods
      to simplify and hide the details of converting between Java
      method invocations and their associated XML messages.
      However, in some cases, you might desire to work at the XML
      message level. Support for invoking services at the XML
      message level is provided by the Dispatch client API. The
      Dispatch client API, <tt>javax.xml.ws.Dispatch</tt>, is a
      dynamic JAX-WS client programming interface. To write a
      Dispatch client, you must have expertise with the Dispatch
      client APIs, the supported object types, and knowledge of the
      message representations for the associated WSDL file. The
      Dispatch client can send data in either <tt>MESSAGE</tt>
      or <tt>PAYLOAD</tt> mode. When using the
      <tt>javax.xml.ws.Service.Mode.MESSAGE</tt> mode, the
      Dispatch client is responsible for providing the entire SOAP
      envelope including the <tt>&lt;soap:Envelope&gt;</tt>,
      <tt>&lt;soap:Header&gt;</tt>, and
      <tt>&lt;soap:Body&gt;</tt> elements. When using the
      <tt>javax.xml.ws.Service.Mode.PAYLOAD</tt> mode, the
      Dispatch client is only responsible for providing the
      contents of the <tt>&lt;soap:Body&gt;</tt> and JAX-WS
      includes the payload in a <tt>&lt;soap:Envelope&gt;</tt>
      element.<br />
      <br />
      The Dispatch client API requires application clients to
      construct messages or payloads as XML which requires a
      detailed knowledge of the message or message payload. The
      Dispatch client supports the following types of objects:

      
<ul>
        
<li><tt>javax.xml.transform.Source</tt>: Use
        <tt>Source</tt> objects to enable clients to use XML
        APIs directly. You can use <tt>Source</tt> objects with
        SOAP or HTTP bindings.</li>

        
<li>JAXB objects: Use JAXB objects so that clients can use
        JAXB objects that are generated from an XML schema to
        create and manipulate XML with JAX-WS applications. JAXB
        objects can only be used with SOAP or HTTP bindings.</li>

        
<li><tt>javax.xml.soap.SOAPMessage</tt>: Use
        <tt>SOAPMessage</tt> objects so that clients can work
        with SOAP messages. You can only use
        <tt>SOAPMessage</tt> objects with SOAP bindings.</li>

        
<li><tt>javax.activation.DataSource</tt>: Use
        <tt>DataSource</tt> objects so that clients can work
        with Multipurpose Internet Mail Extension (MIME) messages.
        Use <tt>DataSource</tt> only with HTTP bindings.</li>
      </ul><br />
      For example, if the input parameter type is
      javax.xml.transform.Source, the call to the Dispatch client
      API is similar to the following code example:
      
<div>
<pre>Dispatch<b>&lt;Source&gt;</b> dispatch = &#x2026; create a Dispatch<b>&lt;Source&gt;</b>
Source request = &#x2026; create a Source object
Source response = dispatch.invoke(request);</pre></div>The Dispatch parameter value determines the return type of
the <tt>invoke()</tt> method.<br />
      <br />
      The Dispatch client is invoked in one of three ways:<br />

      
<ul>
        
<li>Synchronous invocation for requests and responses using
        the <tt>invoke</tt> method</li>

        
<li>Asynchronous invocation for requests and responses
        using the <tt>invokeAsync</tt> method with a callback
        or polling object</li>

        
<li>One-way invocation using the <tt>invokeOneWay</tt>
        methods</li>
      </ul><br />
      Refer to Chapter 4, section 3 of the JAX-WS 2.0 specification
      for more information on using a Dispatch client.

      </div>
<div class="section">
<h4><a name="Dynamic_Proxy_client"></a>Dynamic Proxy client</h4>The static client programming
      model for JAX-WS is the called the Dynamic Proxy client. The
      Dynamic Proxy client invokes a Web service based on a Service
      Endpoint Interface (SEI) which must be provided. The Dynamic
      Proxy client is similar to the stub client in the Java API
      for XML-based RPC (JAX-RPC) programming model. Although the
      JAX-WS Dynamic Proxy client and the JAX-RPC stub client are
      both based on the Service Endpoint Interface (SEI) that is
      generated from a WSDL file , there is a major difference. The
      Dynamic Proxy client is dynamically generated at run time
      using the Java 5 Dynamic Proxy functionality, while the
      JAX-RPC-based stub client is a non-portable Java file that is
      generated by tooling. Unlike the JAX-RPC stub clients, the
      Dynamic Proxy client does not require you to regenerate a
      stub prior to running the client on an application server for
      a different vendor because the generated interface does not
      require the specific vendor information.<br />
      <br />
      The Dynamic Proxy instances extend the
      <tt>java.lang.reflect.Proxy</tt> class and leverage the
      Dynamic Proxy function in the base Java Runtime Environment
      Version 5. The client application can then provide an
      interface that is used to create the proxy instance while the
      runtime is responsible for dynamically creating a Java object
      that represents the SEI.<br />
      <br />
      The Dynamic Proxy client is invoked in one of three
      ways:<br />

      
<ul>
        
<li>Synchronous invocation for requests and responses using
        the <tt>invoke</tt> method</li>

        
<li>Asynchronous invocation for requests and responses
        using the <tt>invokeAsync</tt> method with a callback
        or polling object</li>

        
<li>One-way invocation using the <tt>invokeOneWay</tt>
        methods</li>
      </ul><br />
      Refer to Chapter 4 of the JAX-WS 2.0 specification for more
      information on using Dynamic Proxy clients.

      </div></div>
<div class="section">
<h3><a name="Developing_a______JAX-WS_client_from_a_WSDL_document"></a><a name="ProxyClient" id="ProxyClient">Developing a
      JAX-WS client from a WSDL document</a></h3>Java API for
      XML-Based Web Services (JAX-WS) tooling supports generating
      Java artifacts you need to develop static JAX-WS Web services
      clients when starting with a Web Services Description
      Language (WSDL) file.<br />
      <br />
      The static client programming model for JAX-WS is the called
      the dynamic proxy client. The dynamic proxy client invokes a
      Web service based on a service endpoint interface that is
      provided. After you create the proxy, the client application
      can invoke methods on the proxy just like a standard
      implementation of those interfaces. For JAX-WS Web service
      clients using the dynamic proxy programming model, use the
      JAX-WS tool, <b>wsimport</b>, to process a WSDL file and
      generate portable Java artifacts that are used to create a
      Web service client.<br />
      <br />
      Create the following portable Java artifacts using the
      wsimport tool:

      
<ul>
        
<li>Service endpoint interface (SEI)</li>

        
<li>Service class</li>

        
<li>Exception class that is mapped from the wsdl:fault
        class (if any)</li>

        
<li>Java Architecture for XML Binding (JAXB) generated type
        values which are Java classes mapped from XML schema
        types</li>
      </ul><br />
      The steps to creating a dynamic proxy client are:

      
<ol style="list-style-type: decimal">
        
<li>(Optional) If you are using WSDL or schema
        customizations, use the <b>-b</b> option with the
        <b>wsimport</b> command to specify an external binding
        files that contain your customizations.<br />
        <br />
        For example: <b>wsimport -b <i>binding.xml
        wsdlfile.wsdl</i></b>.<br />
        <br />
        You can customize the bindings in your WSDL file to enable
        asynchronous mappings or attachments. To generate
        asynchronous interfaces, add the client-side only
        customization <tt>enableAsyncMapping</tt> binding
        declaration to the <tt>wsdl:definitions</tt> element or
        in an external binding file that is defined in the WSDL
        file. Use the <tt>enableMIMEContent</tt> binding
        declaration in your custom client or server binding file to
        enable or disable the default <tt>mime:content</tt>
        mapping rules. For additional information on custom binding
        declarations, see chapter 8 the JAX-WS specification.</li>

        
<li style="list-style: none"><br /></li>

        
<li>Run the <b>wsimport -keep <i>wsdl_UR</i>L</b> command
        to generate the portable client artifacts. Use the
        <b>-verbose</b> option to see a list of generated files
        when you run the command.<br />
        <br />
        Best practice: When you run the <b>wsimport</b> tool, the
        location of your WSDL file must either be omitted or point
        to a valid WSDL document. A best practice for ensuring that
        you produce a JAX-WS Web services client that is portable
        to other systems is to package the WSDL document within the
        application module such as a Web services client Java
        archive (JAR) file or a Web archive (WAR) file. You can
        specify a relative URI for the location of your WSDL file
        by using the<tt>-wsdllocation</tt> annotation
        attribute. For example, if your MyService.wsdl file is
        located in the META-INF/wsdl/ directory, then run the
        wsimport tool and use the <tt>-wsdllocation</tt> option
        to specify the value to be used for the location of the
        WSDL file.<br />
        <br />
        <tt>wsimport -keep
        -wsdllocation=META-INF/wsdl/MyService.wsdl</tt></li>
      </ol>

      </div>
<div class="section">
<h3><a name="Developing_a______dynamic_client_using_JAX-WS_APIs"></a><a name="DispatchClient" id="DispatchClient">Developing a
      dynamic client using JAX-WS APIs</a></h3>JAX-WS provides a
      new dynamic Dispatch client API that is more generic and
      offers more flexibility than the existing Java API for
      XML-based RPC (JAX-RPC)-based Dynamic Invocation Interface
      (DII). The Dispatch client interface,
      <tt>javax.xml.ws.Dispatch</tt>, is an XML messaging
      oriented client that is intended for advanced XML developers
      who prefer to work at the XML level using XML constructs. To
      write a Dispatch client, you must have expertise with the
      Dispatch client APIs, the supported object types, and
      knowledge of the message representations for the associated
      WSDL file.<br />
      <br />
      The Dispatch API can send data in either <tt>PAYLOAD</tt>
      or <tt>MESSAGE</tt> mode. When using the
      <tt>PAYLOAD</tt> mode, the Dispatch client is only
      responsible for providing the contents of the
      <tt>&lt;soap:Body&gt;</tt> and JAX-WS includes the input
      payload in a <tt>&lt;soap:Envelope&gt;</tt> element. When
      using the <tt>MESSAGE</tt> mode, the Dispatch client is
      responsible for providing the entire SOAP envelope.<br />
      <br />
      The Dispatch client API requires application clients to
      construct messages or payloads as XML and requires a detailed
      knowledge of the message or message payload. The Dispatch
      client can use HTTP bindings when using <tt>Source</tt>
      objects, Java Architecture for XML Binding (JAXB) objects, or
      data source objects. The Dispatch client supports the
      following types of objects:<br />
      <br />

      
<ul>
        
<li><tt>javax.xml.transform.Source</tt>: Use
        <tt>Source</tt> objects to enable clients to use XML
        APIs directly. You can use <tt>Source</tt> objects with
        SOAP and HTTP bindings.</li>

        
<li>JAXB objects: Use JAXB objects so that clients can use
        JAXB objects that are generated from an XML schema to
        create and manipulate XML with JAX-WS applications. JAXB
        objects can only be used with SOAP and HTTP bindings.</li>

        
<li><tt>javax.xml.soap.SOAPMessage</tt>: Use
        <tt>SOAPMessage</tt> objects so that clients can work
        with SOAP messages. You can only use
        <tt>SOAPMessage</tt> objects with SOAP version 1.1 or
        SOAP version 1.2 bindings.</li>

        
<li><tt>javax.activation.DataSource</tt>: Use
        <tt>DataSource</tt> objects so that clients can work
        with Multipurpose Internet Mail Extension (MIME) messages.
        Use <tt>DataSource</tt> only with HTTP bindings.</li>
      </ul><br />
      The Dispatch API uses the concept of generics that are
      introduced in Java Runtime Environment Version 5. For each of
      the invoke() methods on the Dispatch interface, generics are
      used to determine the return type.<br />
      <br />
      The steps to creating a dynamic client are:

      
<ol style="list-style-type: decimal">
        
<li>Determine if you want your dynamic client to send data
        in <tt>PAYLOAD</tt> or <tt>MESSAGE</tt> mode.</li>

        
<li>Create a service instance and add at least one port to
        it. The port carries the protocol binding and service
        endpoint address information.</li>

        
<li>Create a <tt>Dispatch&lt;T&gt;</tt> object using
        either the <tt>Service.Mode.PAYLOAD</tt> method or the
        <tt>Service.Mode.MESSAGE</tt> method.</li>

        
<li>Configure the request context properties on the
        <tt>javax.xml.ws.BindingProvider</tt> interface. Use
        the request context to specify additional properties such
        as enabling HTTP authentication or specifying the endpoint
        address.</li>

        
<li>Compose the client request message for the dynamic
        client.</li>

        
<li>Invoke the service endpoint with the Dispatch client
        either synchronously or asynchronously.</li>

        
<li>Process the response message from the service.</li>
      </ol><br />
      The following example illustrates the steps to create a
      Dispatch client and invoke a sample EchoService service
      endpoint.
      
<div>
<pre>
   String endpointUrl = ...;
                
   QName serviceName = new QName(&quot;http://org/apache/ws/axis2/sample/echo/&quot;,
    &quot;EchoService&quot;);
   QName portName = new QName(&quot;http://org/apache/ws/axis2/sample/echo/&quot;,
    &quot;EchoServicePort&quot;);
                
   /** Create a service and add at least one port to it. **/ 
   Service service = Service.create(serviceName);
   service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointUrl);
                
   /** Create a Dispatch instance from a service.**/ 
   Dispatch&lt;SOAPMessage&gt; dispatch = service.createDispatch(portName, 
   SOAPMessage.class, Service.Mode.MESSAGE);
        
   /** Create SOAPMessage request. **/
   // compose a request message
   MessageFactory mf = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);

   // Create a message.  This example works with the SOAPPART.
   SOAPMessage request = mf.createMessage();
   SOAPPart part = request.getSOAPPart();

   // Obtain the SOAPEnvelope and header and body elements.
   SOAPEnvelope env = part.getEnvelope();
   SOAPHeader header = env.getHeader();
   SOAPBody body = env.getBody();

   // Construct the message payload.
   SOAPElement operation = body.addChildElement(&quot;invoke&quot;, &quot;ns1&quot;,
    &quot;http://org/apache/ws/axis2/sample/echo/&quot;);
   SOAPElement value = operation.addChildElement(&quot;arg0&quot;);
   value.addTextNode(&quot;ping&quot;);
   request.saveChanges();

   /** Invoke the service endpoint. **/
   SOAPMessage response = dispatch.invoke(request);

   /** Process the response. **/
</pre></div>

      </div>
<div class="section">
<h2><a name="Running_a_JAX-WS______client"></a><a name="RunClient" id="RunClient">Running a JAX-WS
      client</a></h2>A JAX-WS client may be started from the
      command line like any other Axis2-based client, including
      through the use of the <tt>axis2</tt> shell scripts in
      the <tt>bin</tt> directory of the installed runtime.

      
<div class="section">
<h2><a name="Invoking_JAX-WS_Web_services______asynchronously"></a><a name="Async" id="Async">Invoking JAX-WS Web services
      asynchronously</a></h2>Java API for XML-Based Web Services
      (JAX-WS) provides support for invoking Web services using an
      asynchronous client invocation. JAX-WS provides support for
      both a callback and polling model when calling Web services
      asynchronously. Both the callback model and the polling model
      are available on the Dispatch client and the Dynamic Proxy
      client.<br />
      <br />
      An asynchronous invocation of a Web service sends a request
      to the service endpoint and then immediately returns control
      to the client program without waiting for the response to
      return from the service. JAX-WS asynchronous Web service
      clients consume Web services using either the callback
      approach or the polling approach. Using a polling model, a
      client can issue a request and receive a response object that
      is polled to determine if the server has responded. When the
      server responds, the actual response is retrieved. Using the
      callback model, the client provides a callback handler to
      accept and process the inbound response object. The
      <tt>handleResponse()</tt> method of the handler is called
      when the result is available. Both the polling and callback
      models enable the client to focus on continuing to process
      work without waiting for a response to return, while
      providing for a more dynamic and efficient model to invoke
      Web services.

      
<div class="section">
<h3><a name="Using_the_callback_asynchronous_invocation_model"></a>Using the callback asynchronous invocation model</h3>To
      implement an asynchronous invocation that uses the callback
      model, the client provides an <tt>AsynchHandler</tt>
      callback handler to accept and process the inbound response
      object. The client callback handler implements the
      <tt>javax.xml.ws.AsynchHandler</tt> interface, which
      contains the application code that is executed when an
      asynchronous response is received from the server. The
      <tt>javax.xml.ws.AsynchHandler</tt> interface contains
      the <tt>handleResponse(java.xml.ws.Response)</tt> method
      that is called after the run time has received and processed
      the asynchronous response from the server. The response is
      delivered to the callback handler in the form of a
      <tt>javax.xml.ws.Response</tt> object. The response
      object returns the response content when the
      <tt>get()</tt> method is called. Additionally, if an
      error was received, then an exception is returned to the
      client during that call. The response method is then invoked
      according to the threading model used by the executor method,
      <tt>java.util.concurrent.Executor</tt> on the client's
      <tt>java.xml.ws.Service</tt> instance that was used to
      create the Dynamic Proxy or Dispatch client instance. The
      executor is used to invoke any asynchronous callbacks
      registered by the application. Use the
      <tt>setExecutor</tt> and <tt>getExecutor</tt> methods
      to modify and retrieve the executor configured for your
      service.

      </div>
<div class="section">
<h3><a name="Using_the_polling_asynchronous_invocation_model"></a>Using the polling asynchronous invocation model</h3>Using
      the polling model, a client can issue a request and receive a
      response object that can subsequently be polled to determine
      if the server has responded. When the server responds, the
      actual response can then be retrieved. The response object
      returns the response content when the <tt>get()</tt>
      method is called. The client receives an object of type
      <tt>javax.xml.ws.Response</tt> from the
      <tt>invokeAsync</tt> method. That <tt>Response</tt>
      object is used to monitor the status of the request to the
      server, determine when the operation has completed, and to
      retrieve the response results.

      </div>
<div class="section">
<h3><a name="Using_an_asynchronous_message_exchange"></a>Using an asynchronous message exchange</h3>By default,
      asynchronous client invocations do not have asynchronous
      behavior of the message exchange pattern on the wire. The
      programming model is asynchronous; however, the exchange of
      request or response messages with the server is not
      asynchronous. To use an asynchronous message exchange, the
      org.apache.axis2.jaxws.use.async.mep property must be set on
      the client request context with a boolean value of true. When
      this property is enabled, the messages exchanged between the
      client and server are different from messages exchanged
      synchronously. With an asynchronous exchange, the request and
      response messages have WS-Addressing headers added that
      provide additional routing information for the messages.
      Another major difference between asynchronous and synchronous
      message exchange is that the response is delivered to an
      asynchronous listener that then delivers that response back
      to the client. For asynchronous exchanges, there is no
      timeout that is sent to notify the client to stop listening
      for a response. To force the client to stop waiting for a
      response, issue a <tt>Response.cancel()</tt> method on
      the object returned from a polling invocation or a
      <tt>Future.cancel()</tt> method on the object returned
      from a callback invocation. The cancel response does not
      affect the server when processing a request.<br />
      <br />
      The steps necessary to invoke a Web service asynchronously
      are:

      
<ol style="list-style-type: decimal">
        
<li>Determine if you want to implement the callback method
        or the polling method for the client to asynchronously
        invoke the Web service.</li>

        
<li>(Optional) Configure the client request context. Add
        the<br />
          <br />
          <tt>org.apache.axis2.jaxws.use.async.mep</tt><br />
          <br />
          property to the request context to enable asynchronous
          messaging for the Web services client. Using this
          property requires that the service endpoint supports
          WS-Addressing which is supported by default for the
          application server. The following example demonstrates
          how to set this property:
          
<div>
<pre>
           Map&lt;String, Object&gt; rc = ((BindingProvider) port).getRequestContext();
           rc.put(&quot;org.apache.axis2.jaxws.use.async.mep&quot;, Boolean.TRUE);
</pre></div>
        </li>

        
<li>To implement the asynchronous callback method, perform
        the following steps.

          
<ol style="list-style-type: decimal">
            
<li>Find the asynchronous callback method on the SEI or
            <tt>javax.xml.ws.Dispatch</tt> interface. For an
            SEI, the method name ends in <tt>Async</tt> and has
            one more parameter than the synchronous method of type
            <tt>javax.xml.ws.AsyncHandler</tt>. The
            <tt>invokeAsync(Object, AsyncHandler)</tt> method
            is the one that is used on the Dispatch interface.</li>

            
<li>(Optional) Add the <tt>service.setExecutor</tt>
            methods to the client application. Adding the executor
            methods gives the client control of the scheduling
            methods for processing the response. You can also
            choose to use the <tt>java.current.Executors</tt>
            class factory to obtain packaged executors or implement
            your own executor class. See the JAX-WS specification
            for more information on using executor class methods
            with your client.</li>

            
<li>Implement the
            <tt>javax.xml.ws.AsynchHandler</tt> interface. The
            <tt>javax.xml.ws.AsynchHandler</tt> interface only
            has the
            <tt>handleResponse(javax.xml.ws.Response)</tt>
            method. The method must contain the logic for
            processing the response or possibly an exception. The
            method is called after the client run time has received
            and processed the asynchronous response from the
            server.</li>

            
<li>Invoke the asynchronous callback method with the
            parameter data and the callback handler.</li>

            
<li>The <tt>handleResponse(Response)</tt> method is
            invoked on the callback object when the response is
            available. The <tt>Response.get()</tt> method is
            called within this method to deliver the response.</li>
          </ol>
        </li>

        
<li>To implement the polling method,

          
<ol style="list-style-type: decimal">
            
<li>Find the asynchronous polling method on the SEI or
            <tt>javax.xml.ws.Dispatch</tt> interface. For an
            SEI, the method name ends in <tt>Async</tt> and has
            a return type of <tt>javax.xml.ws.Response</tt>.
            The <tt>invokeAsync(Object)</tt> method is used on
            the Dispatch interface.</li>

            
<li>Invoke the asynchronous polling method with the
            parameter data.</li>

            
<li>The client receives the object type,
            <tt>javax.xml.ws.Response</tt>, that is used to
            monitor the status of the request to the server. The
            <tt>isDone()</tt> method indicates whether the
            invocation has completed. When the
            <tt>isDone()</tt> method returns a value of true,
            call the <tt>get()</tt> method to retrieve the
            response object.</li>
          </ol>
        </li>

        
<li>Use the <tt>cancel()</tt> method for the callback
        or polling method if the client needs to stop waiting for a
        response from the service. If the <tt>cancel()</tt>
        method is invoked by the client, the endpoint continues to
        process the request. However, the wait and response
        processing for the client is stopped.</li>
      </ol><br />
      When developing Dynamic Proxy clients, after you generate the
      portable client artifacts from a WSDL file using the
      <b>wsimport</b> command, the generated service endpoint
      interface (SEI) does not have asynchronous methods included
      in the interface. Use JAX-WS bindings to add the asynchronous
      callback or polling methods on the interface for the Dynamic
      Proxy client. To enable asynchronous mappings, you can add
      the <tt>jaxws:enableAsyncMapping</tt> binding declaration
      to the WSDL file. For more information on adding binding
      customizations to generate an asynchronous interface, see
      chapter 8 of the JAX-WS specification.<br />
      <br />
      Note: When you run the <b>wsimport</b> tool and enable
      asynchronous invocation through the use of the JAX-WS
      <tt>enableAsyncMapping</tt> binding declaration, ensure
      that the corresponding response message your WSDL file does
      not contain parts. When a response message does not contain
      parts, the request acts as a two-way request, but the actual
      response that is sent back is empty. The <b>wsimport</b> tool
      does not correctly handle a void response. To avoid this
      scenario, you can remove the output message from the
      operation which makes your operation a one-way operation or
      you can add a &lt;wsdl:part&gt; to your message. For more
      information on the usage, syntax and parameters for the
      <b>wsimport</b> tool, see the <b>wsimport</b> command for
      JAX-WS applications documentation.<br />
      <br />
      The following example illustrates a Web service interface
      with methods for asynchronous requests from the client.
      
<div>
<pre>
   @WebService

   public interface CreditRatingService {
          // Synchronous operation.
          Score getCreditScore(Customer     customer);
          // Asynchronous operation with polling.
          <b>Response&lt;Score&gt;</b> getCreditScoreAsync(Customer customer);
          // Asynchronous operation with callback.
          <b>Future&lt;?&gt;</b> getQuoteAsync(Customer customer, 
                 <b>AsyncHandler&lt;Score&gt;</b> handler);
   }
</pre></div>Using the callback method The callback method requires a
callback handler that is shown in the following example. When using
the callback procedure, after a request is made, the callback
handler is responsible for handling the response. The response
value is a response or possibly an exception. The
<tt>Future&lt;?&gt;</tt> method represents the result of an
asynchronous computation and is checked to see if the computation
is complete. When you want the application to find out if the
request is completed, invoke the <tt>Future.isDone()</tt>
method. Note that the <tt>Future.get()</tt> method does not
provide a meaningful response and is not similar to the <tt>
      Response.get()</tt> method.
      
<div>
<pre>
   CreditRatingService svc = ...;
 
   <b>Future&lt;?&gt;</b> invocation = svc.getCreditScoreAsync(customerTom,
          <b>new AsyncHandler&lt;Score&gt;() {
                 public void handleResponse (
                        Response&lt;Score&gt; response)
                     {
                        score = response.get();
                        // process the request...
                     }
       }</b>
  );
</pre></div>Using the polling method The following example illustrates an
asynchronous polling client:
      
<div>
<pre>
   CreditRatingService svc = ...;
   <b>Response&lt;Score&gt; response</b> = svc.getCreditScoreAsync(customerTom);
 
   while (<b>!response.isDone()</b>) {
          // Do something while we wait.
   }
 

   score = <b>response.get()</b>;
</pre></div>

      </div>
<div class="section">
<h2><a name="Using_handlers_in_JAX-WS______Web_services"></a><a name="Handlers" id="Handlers">Using handlers in JAX-WS
      Web services</a></h2>As in the Java API for XML-based RPC
      (JAX-RPC) programming model, the JAX-WS programming model
      provides an application handler facility that enables you to
      manipulate a message on either an inbound or an outbound
      flow. You can add handlers into the JAX-WS runtime
      environment to perform additional processing of request and
      response messages. You can use handlers for a variety of
      purposes such as capturing and logging information and adding
      security or other information to a message. Because of the
      support for additional protocols beyond SOAP, JAX-WS provides
      two different classifications for handlers. One type of
      handler is a logical handler that is protocol independent and
      can obtain the message in the flow as an extensible markup
      language (XML) message. The logical handlers operate on
      message context properties and message payload. These
      handlers must implement the
      <tt>javax.xml.ws.handler.LogicalHandler</tt> interface. A
      logical handler receives a <tt>LogicalMessageContext</tt>
      object from which the handler can get the message
      information. Logical handlers can exist on both SOAP and
      XML/HTTP-based configurations.<br />
      <br />
      The second type of handler is a protocol handler. The
      protocol handlers operate on message context properties and
      protocol-specific messages. Protocol handlers are limited to
      SOAP-based configurations and must implement the
      <tt>javax.xml.ws.handler.soap.SOAPHandler</tt> interface.
      Protocol handlers receive the message as a
      <tt>javax.xml.soap.SOAPMessage</tt> to read the message
      data.<br />
      <br />
      The JAX-WS runtime makes no distinction between server-side
      and client-side handler classes. The runtime does not
      distinguish between inbound or outbound flow when a
      <tt>handleMessage(MessageContext)</tt> method or
      <tt>handleFault(MessageContext)</tt> method for a
      specific handler is invoked. You must configure the handlers
      for the server or client, and implement sufficient logic
      within these methods to detect the inbound or outbound
      direction of the current message.<br />
      <br />
      To use handlers with Web services client applications, you
      must add the <tt>@HandlerChain</tt> annotation to the
      service endpoint interface or the generated service class and
      provide the handler chain configuration file. The
      <tt>@HandlerChain</tt> annotation contains a file
      attribute that points to a handler chain configuration file
      that you create. For Web services client applications, you
      can also configure the handler chain programmatically using
      the Binding API. To modify the <tt>handlerchain</tt>
      class programmatically, use either the default implementation
      or a custom implementation of the
      <tt>HandlerResolver</tt> method.<br />
      <br />
      To use handlers with your server application, you must set
      the <tt>@HandlerChain</tt> annotation on either the
      service endpoint interface or the endpoint implementation
      class, and provide the associated handler chain configuration
      file. Handlers for the server are only configured by setting
      the <tt>@HandlerChain</tt> annotation on the service
      endpoint implementation or the implementation class. The
      handler classes must be included in the deployed
      artifact.<br />
      <br />
      For both server and client implementations of handlers using
      the <tt>@HandlerChain</tt> annotation, you must specify
      the location of the handler configuration as either a
      relative path from the annotated file or as an absolute URL.
      For example:<br />
      <br />
      
<div>
<pre>
   @HandlerChain(file=&quot;../../common/handlers/myhandlers.xml&quot;)
</pre></div>or
      
<div>
<pre>
   @HandlerChain(file=&quot;http://foo.com/myhandlers.xml&quot;)
</pre></div>For more information on the schema of the handler
configuration file, see the JSR 181 specification.<br />
      <br />
      For more information regarding JAX-WS handlers, see chapter 9
      of the JAX-WS specification.<br />
      <br />
      To create a JAX-WS handler:

      
<ol style="list-style-type: decimal">
        
<li>Determine if you want to implement JAX-WS handlers on
        the service or the client.

          
<ol style="list-style-type: decimal">
            
<li>Use the default implementation of a handler
            resolver. The runtime now uses the
            <tt>@HandlerChain</tt> annotation and the default
            implementation of <tt>HandlerResolver</tt> class to
            build the handler chain. You can obtain the existing
            handler chain from the <tt>Binding</tt>, add or
            remove handlers, and then return the modified handler
            chain to the <tt>Binding</tt> object.</li>

            
<li>To use a custom implementation of a handler
            resolver, set the custom <tt>HandlerResolver</tt>
            class on the <tt>Service</tt> instance. The runtime
            uses your custom implementation of the
            <tt>HandlerResolver</tt> class to build the handler
            chain, and the default runtime implementation is not
            used. In this scenario, the <tt>@HandlerChain</tt>
            annotation is not read when retrieving the handler
            chain from the binding after the custom
            <tt>HandlerResolver</tt> instance is registered on
            the <tt>Service</tt> instance. You can obtain the
            existing handler chain from the <tt>Binding</tt>,
            add or remove handlers, and then return the modified
            handler chain to the <tt>Binding</tt> object.</li>
          </ol>
        </li>

        
<li>Configure the client handlers by setting the
        <tt>@HandlerChain</tt> annotation on the service
        instance or service endpoint interface, or you can modify
        the handler chain programmatically to control how the
        handler chain is built in the runtime. If you choose to
        modify the handler chain programmatically, then you must
        determine if you will use the default handler resolver or
        use a custom implementation of a handler resolver that is
        registered on the service instance. A service instance uses
        a handler resolver when creating binding providers. When
        the binding providers are created, the handler resolver
        that is registered with a service is used to create a
        handler chain and the handler chain is subsequently used to
        configure the binding provider.</li>

        
<li>Configure the server handlers by setting the
        <tt>@HandlerChain</tt> annotation on the service
        endpoint interface or implementation class. When the
        <tt>@HandlerChain</tt> annotation is configured on both
        the service endpoint interface and the implementation
        class, the implementation class takes priority.</li>

        
<li>Create the handler chain configuration XML file. You
        must create a handler chain configuration XML file for the
        <tt>@HandlerChain</tt> to reference.</li>

        
<li>Add the handler chain configuration XML file in the
        class path for the service endpoint interface when
        configuring the server or client handlers using the
        <tt>@HandlerChain</tt> annotation. You must also
        include the handler classes contained in the configuration
        XML file in your class path.</li>

        
<li>Write your handler implementation.</li>
      </ol><br />
      The following example illustrates the steps necessary to
      configure JAX-WS handlers on a service endpoint interface
      using the <tt>@HandlerChain</tt> annotation.<br />
      <br />
      The <tt>@HandlerChain</tt> annotation has a file
      attribute that points to a handler chain configuration XML
      file that you create. The following file illustrates a
      typical handler configuration file. The
      <tt>protocol-bindings</tt>,
      <tt>port-name-pattern</tt>, and
      <tt>service-name-pattern</tt> elements are all filters
      that are used to restrict which services can apply the
      handlers.
      
<div>
<pre>
   &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

   &lt;jws:handler-chains xmlns:jws=&quot;http://java.sun.com/xml/ns/javaee&quot;&gt;
   &lt;!-- Note:  The '*&quot; denotes a wildcard. --&gt;

        &lt;jws:handler-chain name=&quot;MyHandlerChain&quot;&gt;
                &lt;jws:protocol-bindings&gt;##SOAP11_HTTP ##ANOTHER_BINDING&lt;/jws:protocol-bindings&gt;
                &lt;jws:port-name-pattern 
                 xmlns:ns1=&quot;http://handlersample.samples.apache.org/&quot;&gt;ns1:MySampl*&lt;/jws:port-name-pattern&gt;
           &lt;jws:service-name-pattern 
                 xmlns:ns1=&quot;http://handlersample.samples.apache.org/&quot;&gt;ns1:*&lt;/jws:service-name-pattern&gt;
                &lt;jws:handler&gt;
                        &lt;jws:handler-class&gt;org.apache.samples.handlersample.SampleLogicalHandler&lt;/jws:handler-class&gt;
                &lt;/jws:handler&gt;
                &lt;jws:handler&gt;
                        &lt;jws:handler-class&gt;org.apache.samples.handlersample.SampleProtocolHandler2&lt;/jws:handler-class&gt;
                &lt;/jws:handler&gt;
                &lt;jws:handler&gt;
                        &lt;jws:handler-class&gt;org.apache.samples.handlersample.SampleLogicalHandler&lt;/jws:handler-class&gt;
                &lt;/jws:handler&gt;
                &lt;jws:handler&gt;
                        &lt;jws:handler-class&gt;org.apache.samples.handlersample.SampleProtocolHandler2&lt;/jws:handler-class&gt;
                &lt;/jws:handler&gt;
        &lt;/jws:handler-chain&gt;
        
   &lt;/jws:handler-chains&gt;
</pre></div>Make sure that you add the handler.xml file and the handler
classes contained in the handler.xml file in your class path.<br />

      <br />
      The following example demonstrates a handler implementation:
      
<div>
<pre>
   package org.apache.samples.handlersample;

   import java.util.Set;

   import javax.xml.namespace.QName;
   import javax.xml.ws.handler.MessageContext;
   import javax.xml.ws.handler.soap.SOAPMessageContext;

   public class SampleProtocolHandler implements
           javax.xml.ws.handler.soap.SOAPHandler&lt;SOAPMessageContext&gt; {

       public void close(MessageContext messagecontext) {
       }

       public Set&lt;QName&gt; getHeaders() {
           return null;
       }

       public boolean handleFault(SOAPMessageContext messagecontext) {
           return true;
       }

       public boolean handleMessage(SOAPMessageContext messagecontext) {
           Boolean outbound = (Boolean) messagecontext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
           if (outbound) {
               // Include your steps for the outbound flow.
           }
           return true;
       }

   }
</pre></div>

      
<div class="section">
<h2><a name="Enabling_HTTP______session_management_support_for_JAX-WS______applications"></a><a name="HTTPSession" id="HTTPSession">Enabling HTTP
      session management support for JAX-WS
      applications</a></h2>You can use HTTP session management to
      maintain user state information on the server, while passing
      minimal information back to the user to track the session.
      You can implement HTTP session management on the application
      server using either session cookies or URL rewriting.<br />
      <br />
      The interaction between the browser, application server, and
      application is transparent to the user and the application
      program. The application and the user are typically not aware
      of the session identifier provided by the server.

      
<div class="section">
<h3><a name="Session_cookies"></a>Session cookies</h3>The HTTP maintain session feature
      uses a single cookie, <tt>JSESSIONID</tt>, and this
      cookie contains the session identifier. This cookie is used
      to associate the request with information stored on the
      server for that session. On subsequent requests from the
      JAX-WS application, the session ID is transmitted as part of
      the request header, which enables the application to
      associate each request for a given session ID with prior
      requests from that user. The JAX-WS client applications
      retrieve the session ID from the HTTP response headers and
      then use those IDs in subsequent requests by setting the
      session ID in the HTTP request headers.

      </div>
<div class="section">
<h3><a name="URL_rewriting"></a>URL rewriting</h3>URL rewriting works like a redirected
      URL as it stores the session identifier in the URL. The
      session identifier is encoded as a parameter on any link or
      form that is submitted from a Web page. This encoded URL is
      used for subsequent requests to the same server.<br />
      <br />
      To enable HTTP session management:

      
<ol style="list-style-type: decimal">
        
<li>Configure the server to enable session tracking.</li>

        
<li>Enable session management on the client by setting the
        JAX-WS property,
        <tt>javax.xml.ws.session.maintain</tt>, to true on the
        <tt>BindingProvider</tt>.
          
<div>
<pre>
      Map&lt;String, Object&gt; rc = ((BindingProvider) port).getRequestContext();
      ...
      ...
      rc.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, Boolean.TRUE);
      ...
      ...
   
</pre></div>
        </li>
      </ol>

      </div>
<div class="section">
<h2><a name="Enabling_MTOM"></a><a name="MTOM" id="MTOM">Enabling MTOM</a></h2>JAX-WS
      supports the use of SOAP Message Transmission Optimized
      Mechanism (MTOM) for sending binary attachment data. By
      enabling MTOM, you can send and receive binary data optimally
      without incurring the cost of data encoding to ensure the
      data is included in the XML document.<br />
      <br />
      JAX-WS applications can send binary data as base64 or
      hexBinary encoded data contained within the XML document.
      However, to take advantage of the optimizations provided by
      MTOM, enable MTOM to send binary base64 data as attachments
      contained outside the XML document. MTOM optimization is only
      available for the xs:base64Binary data type. The MTOM option
      is not enabled by default. JAX-WS applications require
      separate configuration of both the client and the server
      artifacts to enable MTOM support. For the server, MTOM can be
      enabled on a JAX-WS JavaBeans endpoint only and not on a
      provider-based endpoint.<br />
      <br />
      To enable MTOM on an endpoint, use the @BindingType
      (javax.xml.ws.BindingType) annotation on a server endpoint
      implementation class to specify that the endpoint supports
      one of the MTOM binding types so that the response messages
      are MTOM-enabled. The javax.xml.ws.SOAPBinding class defines
      two different constants, SOAP11HTTP_MTOM_BINDING and
      SOAP12HTTP_MTOM_BINDING that you can use for the value of the
      @BindingType annotation. For example:
      
<div>
<pre>
   // for SOAP version 1.1
   @BindingType(value = SOAPBinding.SOAP11HTTP_MTOM_BINDING)
   // for SOAP version 1.2
   @BindingType(value = SOAPBinding.SOAP12HTTP_MTOM_BINDING)
</pre></div><br />
      Enable MTOM on the client by using the
      javax.xml.ws.soap.SOAPBinding client-side API. Enabling MTOM
      on the client optimizes the binary messages that are sent to
      the server.

      
<ul>
        
<li>Enable MTOM on a Dispatch client.</li>

        
<li style="list-style: none">The following example uses
        SOAP version 1.1:

          
<ul>
            
<li>First method: Using
            SOAPBinding.setMTOMEnabled()</li>

            
<li style="list-style: none; display: inline">
              
<div>
<pre>
             SOAPBinding binding = (SOAPBinding)dispatch.getBinding();
             binding.setMTOMEnabled(true);
         
</pre></div>
            </li>

            
<li>Second method: Using Service.addPort()</li>

            
<li style="list-style: none; display: inline">
              
<div>
<pre>
 
             Service svc = Service.create(serviceName);
             svc.addPort(portName,SOAPBinding.SOAP11HTTP_MTOM_BINDING,endpointUrl);
         
</pre></div>
            </li>
          </ul>
        </li>

        
<li>Enable MTOM on a Dynamic Proxy client.</li>

        
<li style="list-style: none; display: inline">
          
<div>
<pre>
          // Create a BindingProvider bp from a proxy port.
          Service svc = Service.create(serviceName);
          MtomSample proxy = svc.getPort(portName, MtomSample.class);
          BindingProvider bp = (BindingProvider) proxy;

          //Enable MTOM
          SOAPBinding binding = (SOAPBinding) bp.getBinding();
          binding.setMTOMEnabled(true);
      
</pre></div>
        </li>
      </ul>
    </li>
  </ul>

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