<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia Site Renderer 1.7.4 at 2017-11-22 
 | 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="20171122" />
    <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: 2017-11-22<span class="divider">|</span>
</li>
          <li id="projectVersion">Version: 1.7.7<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>
      </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;2017
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.</p>
        </div>
        </div>
    </footer>
    </body>
</html>