<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia at 2016-05-02 
 | Rendered using Apache Maven Fluido Skin 1.4
-->
<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="20160502" />
    <meta http-equiv="Content-Language" content="en" />
    <title>Apache Axis2 &#x2013; POJO Web Services using Axis2</title>
    <link rel="stylesheet" href="../css/apache-maven-fluido-1.4.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.4.min.js"></script>

    
    <meta name="generator" content="HTML Tidy for Windows (vers 14 June 2007), see www.w3.org" /><meta http-equiv="content-type" content="" />              </head>
        <body class="topBarDisabled">
          
        
    
        <div class="container-fluid">
          <div id="banner">
        <div class="pull-left">
                                    <a href="http://www.apache.org/" id="bannerLeft">
                                                                                        <img src="http://www.apache.org/images/asf_logo_wide.png"  alt="Apache Axis2"/>
                </a>
                      </div>
        <div class="pull-right">                                <a href=".././" id="bannerRight">
                                                                                                <img src="../images/axis.jpg" />
                </a>
      </div>
        <div class="clear"><hr/></div>
      </div>

      <div id="breadcrumbs">
        <ul class="breadcrumb">
                
                    
                  <li id="publishDate">Last Published: 2016-05-02
                      <span class="divider">|</span>
                   </li>
                  <li id="projectVersion">Version: 1.7.2
                          <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 ">POJO Web Services using Axis2</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>
              </ul>
        </li>
                
      <li>
  
                          <a href="../modules/index.html" title="Modules">
          <span class="none"></span>
        Modules</a>
            </li>
                
      <li>
  
                          <a href="../tools/index.html" title="Tools">
          <span class="none"></span>
        Tools</a>
            </li>
                              <li class="nav-header">Documentation</li>
                              
      <li>
  
                          <a href="../docs/toc.html" title="Table of Contents">
          <span class="none"></span>
        Table of Contents</a>
            </li>
                
      <li>
  
                          <a href="../docs/installationguide.html" title="Installation Guide">
          <span class="none"></span>
        Installation Guide</a>
            </li>
                
      <li>
  
                          <a href="../docs/quickstartguide.html" title="QuickStart Guide">
          <span class="none"></span>
        QuickStart Guide</a>
            </li>
                
      <li>
  
                          <a href="../docs/userguide.html" title="User Guide">
          <span class="none"></span>
        User Guide</a>
            </li>
                
      <li>
  
                          <a href="../docs/jaxws-guide.html" title="JAXWS Guide">
          <span class="none"></span>
        JAXWS Guide</a>
            </li>
                
      <li class="active">
  
            <a href="#"><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" >
                                  
            <!-- ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements. See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership. The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License. You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied. See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License. --><html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">


<h1>POJO Web Services using Apache Axis2</h1>

<p>Want a quick way to get a Web service up and running in no time?
Then you should consider creating a Plain Old Java Object (POJO)
that you can deploy using Apache Axis2 on Apache Tomcat. POJOs are
fast to build and easy to maintain, which means you'll save a lot
of time building and debugging your code. This document shows you
how to take a simple POJO, and deploy it on Apache Tomcat as a Web
service in the exploded directory format. You'll also learn how to
take a POJO based on the Spring Framework, and deploy that as an
AAR packaged Web service on Tomcat.</p>

<div class="section">
<h2><a name="Content"></a>Content</h2>

<ul>

<li><a href="#introduction">Introduction</a></li>

<li><a href="#pojo">The POJO</a></li>

<li><a href="#pojows">POJO Web service using Apache Axis2 and
Tomcat</a>

<ul>

<li><a href="#definingservice">Defining the Service:
services.xml</a></li>
</ul>
</li>

<li><a href="#buildpojows">Building the POJO Web Service Using
Ant</a></li>

<li><a href="#testingpojows">Testing the POJO Web Service Using
RPCServiceClient</a>

<ul>

<li><a href="#limitationspojo">Limitations and Strengths of
POJO</a></li>
</ul>
</li>

<li><a href="#springpojows">Spring-based POJO Web Service</a>

<ul>

<li><a href="#quickintro">Quick Introduction</a></li>

<li><a href="#servicedef">The Service Definition:
services.xml</a></li>

<li><a href="#initializingspring">Initializing the Spring
application context: SpringInit</a></li>

<li><a href="#testingrpc">Testing Using an
RPCServiceClient</a></li>
</ul>
</li>

<li><a href="#jsr181pojows">JSR 181 Annotation support with POJO Web services</a>

<ul>

<li><a href="#jsr181definingservice">Sample JSR 181 POJO Web Service</a></li>
</ul>
</li>

<li><a href="#summary">Summary</a></li>

<li><a href="#furtherstudy">For Further Study</a></li>
</ul>
<a name="introduction" id="introduction"></a>

<div class="section">
<h2><a name="Introduction"></a>Introduction</h2>

<p>The task of building a Web service can sometimes be
overwhelming, but not with POJOs! The old-school Plain Old Java
Object is a simple and quick way to get most, if not all, of your
currently existing Java classes up on the Web as readily accessible
Web services. This document describes how to build a POJO-style Web
service with Apache Axis2 and Tomcat. It is organized as
follows:</p>

<ul>

<li>The POJO: This is the Java class that you'll use throughout
this document</li>

<li>POJO deployment</li>

<li>Test the POJO Web service using an RPC based client</li>

<li>Limitations of straight POJO</li>

<li>Spring-based POJO Web service and deployment</li>
</ul>

<p>The code for the document can be found at
Axis2_HOME/samples/pojoguide and Axis2_HOME/samples/pojoguidespring
once you extract the <a href="../download.cgi">Axis2
Standard Distribution</a>. (It is better to get it now as it will
help you to follow along.) Let's get started.</p>
<a name="pojo" id="pojo"></a>

<div class="section">
<h2><a name="The_POJO"></a>The POJO</h2>

<p>The POJO you'll be using throughout this document is a Weather
service POJO that consists of two classes: WeatherService and
Weather. Weather contains the Weather data: Temperature, forecast,
rain (will it rain?), and howMuchRain (See Code Listing 1).</p>

<p><b>Code Listing 1: The Weather POJO</b></p>

<div>
<pre>
package sample.pojo.data;

public class Weather{
    float temperature;
    String forecast;
    boolean rain;
    float howMuchRain;
    
    public void setTemperature(float temp){
        temperature = temp;
    }

    public float getTemperature(){
        return temperature;
    }
    
    public void setForecast(String fore){
        forecast = fore;
    }

    public String getForecast(){
        return forecast;
    }
    
    public void setRain(boolean r){
        rain = r;
    }

    public boolean getRain(){
        return rain;
    }
    
    public void setHowMuchRain(float howMuch){
        howMuchRain = howMuch;
    }

    public float getHowMuchRain(){
        return howMuchRain;
    }
}
</pre></div>

<p>And here's the WeatherService class, shown in Code Listing
2.</p>

<p><b>Code Listing 2: The WeatherService class</b></p>

<div>
<pre>
package sample.pojo.service;

import sample.pojo.data.Weather;

public class WeatherService{
    Weather weather;
    
    public void setWeather(Weather weather){
        this.weather = weather;
    }

    public Weather getWeather(){
        return this.weather;
    }
}
</pre></div>

<p>Note that it's all just straight POJOs with field items and
<tt>getter</tt> and <tt>setter</tt> methods for each field.
Next, you'll take a look at what you need to do to make it ready
for deployment on Apache Axis2 and Tomcat.</p>
<a name="pojows" id="pojows"></a>

<div class="section">
<h2><a name="POJO_Web_Service_Using_Apache_Axis2_and_Tomcat"></a>POJO Web Service Using Apache Axis2 and Tomcat</h2>

<p>Got the POJOs? Great. This section will show you how to package
them in the exploded directory format for easy deployment. First
you'll look at the services.xml file that defines the Web service,
and then you'll build the files using <a class="externalLink" href="http://ant.apache.org/">Apache Ant</a>, and deploy the Web service
on Tomcat.</p>
<a name="definingservice" id="definingservice"></a>

<div class="section">
<h3><a name="Defining_the_Service:_services.xml"></a>Defining the Service: services.xml</h3>

<p>Before Axis2 can understand what is going on, you have to tell
it to use the services.xml file. Let's get right into it (see Code
Listing 3).</p>

<p><b>Code Listing 3: The service definition file:
services.xml</b></p>

<div>
<pre>
&lt;service name=&quot;WeatherService&quot; scope=&quot;application&quot;&gt;
    &lt;description&gt;
        Weather POJO Service
    &lt;/description&gt;
    &lt;messageReceivers&gt;
        &lt;messageReceiver 
            mep=&quot;http://www.w3.org/ns/wsdl/in-only&quot;
    class=&quot;org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver&quot;/&gt;
        &lt;messageReceiver
            mep=&quot;http://www.w3.org/ns/wsdl/in-out&quot;
    class=&quot;org.apache.axis2.rpc.receivers.RPCMessageReceiver&quot;/&gt;
    &lt;/messageReceivers&gt;
    &lt;parameter name=&quot;ServiceClass&quot;&gt;
        sample.pojo.service.WeatherService
    &lt;/parameter&gt;
&lt;/service&gt;
</pre></div>

<p>The name of the service is specified as WeatherService and the
scope of the service is application. As you can see in the
WeatherService POJO, there are two methods: IN-ONLY method and
IN-OUT method. Hence the messageReceiver elements are ordered
within the messageReceivers tag. Lastly, the ServiceClass parameter
specifies the class of the Web service, which is
sample.pojo.service.WeatherService. When operations of your Web
service get called, the methods of the WeatherService class will be
called. Next let usl take a look at an easy method of building your
application using Ant.</p>
<a name="buildpojows" id="buildpojows"></a>
</div>
<div class="section">
<h2><a name="Building_the_POJO_Web_Service_Using_Apache_Ant"></a>Building the POJO Web Service Using Apache Ant</h2>

<p><a class="externalLink" href="http://ant.apache.org/">Ant</a> is a slick build tool.
It helps reduce the time to build the applications, and several of
the Axis2 command-line tools create the build.xml files for you.
(We will not be going into too much detail on the build.xml file
that you'll be using.)</p>

<p>Here are the main Ant tasks you'll be using:</p>

<ul>

<li>generate.service -- This Ant task builds the service relevant
source, and copies the files to build/WeatherService</li>

<li>rpc.client -- This task builds the client relevant files,
builds a JAR at <i>build/lib/rpc-client.jar</i>, and then runs
the client</li>
</ul>

<p>Before you can build the source, you'll need to download the
Axis2 1.7.2-bin and 1.7.2-war distributions
from <a href="../download.cgi">here</a>. Then
modify the following line inside the build.xml file (in the
Axis2_HOME/samples/pojoguide directory in the extracted Axis2
1.7.2 Standard Binary (bin) Distribution) :</p>

<div>
<pre>
&lt;property name=&quot;axis2.home&quot; value=&quot;c:\apps\axis2&quot; /&gt;
</pre></div>

<p>This modification contains the path to the root of the unzipped
Axis2 1.7.2-bin <a href="../download.cgi">download</a>.
With that explanation, you'll now build the source by typing the
following: ant</p>

<p>The following directory format should now exist at
build/WeatherService:</p>

<div>
<pre>
 - WeatherService
   - META-INF
     - services.xml
   - sample
     - pojo
       - data
         - Weather.class
       - service
         - WeatherService.class
</pre></div>

<p>Simple isn't it? An excellent way to dive into Web services
development.</p>

<p>Now get a <a class="externalLink" href="http://tomcat.apache.org/">Tomcat</a>
distribution (I used v5.5), and start it up by running
<i>bin/startup.bat</i> or <i>bin/startup.sh</i>. Once it's
running, deploy the Axis2 1.7.2-war by copying the
axis2.war file to Tomcat's webapps directory. Tomcat will proceed
by deploying axis2 and un-archiving it into the webapps directory.
Now copy the WeatherService directory that was created at the time
of building our project to:
<i>&lt;tomcat-home&gt;/webapps/axis2/WEB-INF/services</i>.</p>

<p>The service should deploy quickly. You willl test the Web
service using the RPCServiceClient in the next section.</p>
<a name="testingpojows" id="testingpojows"></a>

<div class="section">
<h2><a name="Testing_the_POJO_Web_Service_Using_RPCServiceClient"></a>Testing the POJO Web Service Using RPCServiceClient</h2>

<p>OK, so the Web service should be running on Tomcat. Now you'll
build a simple RPCServiceClient and test the POJO Web service.
You'll first start out with the class constructs, creating the
RPCServiceClient and initializing the values of the Weather class
within the Web service (See Code Listing 4).</p>

<p><b>Code Listing 4: Setting the weather</b></p>

<div>
<pre>
package sample.pojo.rpcclient;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

import sample.pojo.data.Weather;


public class WeatherRPCClient {

    public static void main(String[] args1) throws AxisFault {

        RPCServiceClient serviceClient = new RPCServiceClient();

        Options options = serviceClient.getOptions();

        EndpointReference targetEPR = new EndpointReference(
                <b>&quot;http://localhost:8080/axis2/services/WeatherService&quot;);</b>
        options.setTo(targetEPR);

        // Setting the weather
        QName opSetWeather =
            new QName(&quot;http://service.pojo.sample/xsd&quot;, &quot;<b>setWeather&quot;);

        Weather w = new Weather();

        w.setTemperature((float)39.3);
        w.setForecast(&quot;Cloudy with showers&quot;);
        w.setRain(true);
        w.setHowMuchRain((float)4.5);

        Object[] opSetWeatherArgs = new Object[] { w };

        serviceClient.invokeRobust(opSetWeather, opSetWeatherArgs);</b>
...
</pre></div>

<p>The most interesting code to note is in bold font. Notice the
targetEPR variable you create, setting the endpoint reference to
http://localhost:8080/axis2/services/WeatherService. This is where
you deployed it on Axis2. You can also verify this by asking Axis2
to list its services by going to the following URL:
http://localhost:8080/axis2/services/listServices.</p>

<p>Next the opSetWeather variable gets setup, pointing to the
setWeather operation. Then the Weather data is created and
initialized. Lastly, you invoke the Web service, which initializes
the weather data (you'll verify this soon). Next you get back the
weather data (see Code Listing 5).</p>

<p><b>Code Listing 5: Getting the weather data</b></p>

<div>
<pre>
...
        serviceClient.invokeRobust(opSetWeather, opSetWeatherArgs);

        // Getting the weather
        QName opGetWeather =
            new QName(&quot;http://service.pojo.sample/xsd&quot;, &quot;<b>getWeather&quot;);

        Object[] opGetWeatherArgs = new Object[] { };
        Class[] returnTypes = new Class[] { Weather.class };
        
        Object[] response = serviceClient.invokeBlocking(opGetWeather,
                opGetWeatherArgs, returnTypes);
        
        Weather result = (Weather) response[0];
        
        if (result == null) {
            System.out.println(&quot;Weather didn't initialize!&quot;);
            return;
        }</b>
...
</pre></div>

<p>First you set the operation in opGetWeather to getWeather. Then
you create an empty argument list. Note that this time you expect
something back from the Web service, and so you create a list of
return types. Then you invoke the Web service using a blocking call
and wait for the weather data to be returned to you, and you place
it in the result variable. Lastly, you make sure it isn't null and
that it was successfully initialized by the previous call to
setWeather. Now display the data to verify it. (see Code Listing
6).</p>

<p><b>Code Listing 6: Displaying the data</b></p>

<div>
<pre>
...
            return;
        }

        // Displaying the result
        <b>System.out.println(&quot;Temperature               : &quot; +
                           result.getTemperature());
        System.out.println(&quot;Forecast                  : &quot; +
                           result.getForecast());
        System.out.println(&quot;Rain                      : &quot; +
                           result.getRain());
        System.out.println(&quot;How much rain (in inches) : &quot; +
                           result.getHowMuchRain());
        
    }</b>
}
</pre></div>

<p>You should receive the data shown in Code Listing 7.</p>

<p><b>Code Listing 7: Output from running the client</b></p>

<div>
<pre>
rpc.client.run:
     [java] Temperature               : 39.3
     [java] Forecast                  : Cloudy with showers
     [java] Rain                      : true
     [java] How much rain (in inches) : 4.5
</pre></div>

<p>Excellent! You have a working POJO Web service! Next you'll
quickly morph this one into a Spring based POJO.</p>
<a name="limitationspojo" id="limitationspojo"></a>

<div class="section">
<h3><a name="Limitations_and_Strengths_of_POJO"></a>Limitations and Strengths of POJO</h3>

<p>We've covered the strengths of using POJO based Web services,
but what about any limitations? One main limitation of POJO based
Web services is the lack of initialization support (meaning that
you have to go into your Web service and initialize the values
before the Web service is completely useful). However, you'll soon
see how to overcome that limitation with a Spring based POJO, which
is covered next.</p>
<a name="springpojows" id="springpojows"></a>
</div>
<div class="section">
<h2><a name="Spring-based_POJO_Web_Service"></a>Spring-based POJO Web Service</h2>

<p>Spring is a hot framework for J2EE and makes bean usage a
breeze. You'll use it in this section to create a Spring based POJO
Web service. For this section, you'll need the spring.jar from the
latest 1.x Spring download.</p>
<a name="quickintro" id="quickintro"></a>

<div class="section">
<h3><a name="Quick_Introduction"></a>Quick Introduction</h3>

<p>If you take a look at the source code of this document in
Axis2_HOME/samples/pojoguidespring (to see how the Spring based
POJO Web service is coded), you can see that the Weather class
didn't change at all and the WeatherService class only got its name
changed to WeatherSpringService.</p>

<p>You'll also notice an applicationContext.xml file, which we'll
cover later. It is used to setup the beans used in our Web
service.</p>

<p>Now you might wonder what the SpringInit.java class is for. This
service is necessary to initialize the Spring Framework's
application context.</p>

<p>The client is pretty much the same, except you won't use it to
initialize the Weather data in the Web service, since Spring does
that for you using Inversion of Control (IoC), which is covered
next.</p>
<a name="servicedef" id="servicedef"></a>
</div>
<div class="section">
<h3><a name="The_Service_Definition:_services.xml"></a>The Service Definition: services.xml</h3>

<p>Since the core POJOs didn't change, you move straight to the
services.xml file. It's a bit longer this time because it
instantiates two services in one file (see Code Listing 7).</p>

<p><b>Code Listing 7: Defining the services: services.xml</b></p>

<div>
<pre>
&lt;serviceGroup&gt;
  &lt;service <b>name=&quot;SpringInit&quot; 
class=&quot;sample.spring.service.SpringInit</b>&quot;&gt;
    &lt;description&gt;
      This web service initializes Spring.
    &lt;/description&gt;
    <b>&lt;parameter name=&quot;ServiceClass&quot;&gt;
        sample.spring.service.SpringInit
    &lt;/parameter&gt;
    &lt;parameter name=&quot;ServiceTCCL&quot;&gt;composite&lt;/parameter&gt;
    &lt;parameter name=&quot;load-on-startup&quot;&gt;true&lt;/parameter&gt;</b>
    &lt;operation name=&quot;springInit&quot;&gt;
      &lt;messageReceiver 
      class=&quot;org.apache.axis2.receivers.RawXMLINOutMessageReceiver&quot;/&gt;
    &lt;/operation&gt;
  &lt;/service&gt;
  &lt;service <b>name=&quot;WeatherSpringService</b>&quot;&gt;
    &lt;description&gt;
      Weather Spring POJO Axis2 AAR deployment
    &lt;/description&gt;
    <b>&lt;parameter name=&quot;ServiceClass&quot;&gt;
        sample.spring.service.WeatherSpringService
    &lt;/parameter&gt;
    &lt;parameter name=&quot;ServiceObjectSupplier&quot;&gt;
org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier
    &lt;/parameter&gt;
    &lt;parameter name=&quot;SpringBeanName&quot;&gt;
        weatherSpringService
    &lt;/parameter&gt;</b>
    &lt;messageReceivers&gt;
      &lt;messageReceiver mep=&quot;http://www.w3.org/ns/wsdl/in-only&quot;
      class=&quot;org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver&quot;/&gt;
      &lt;messageReceiver mep=&quot;http://www.w3.org/ns/wsdl/in-out&quot;
      class=&quot;org.apache.axis2.rpc.receivers.RPCMessageReceiver&quot;/&gt;
    &lt;/messageReceivers&gt;
  &lt;/service&gt;
&lt;/serviceGroup&gt;
</pre></div>

<p>You'll see a few familiar items in the above listing, and
several changes. Once again, the items in bold are most important.
The ServiceTCCL property under the SpringInit service makes sure
that the Spring class loader is used for the Web service, allowing
it to properly instantiate the Spring application context. The
load-on-startup variable is a must-have so that the service loads
up immediately on startup, creating the Spring application context.
The WeatherSpringService stays similar to the WeatherService
previously with a couple of additions: The ServiceObjectSupplier
provides the service with the Spring application context, making it
&quot;Spring Aware.&quot;</p>

<p>Lastly, the SpringBeanName points to the name of the bean
associated with this Web service, which is defined in the
applicationContext.xml file (essentially the WeatherSpringService).
We'll cover the applicationContext.xml file next. The application
context, applicationContext.xml file tells the Spring Framework
what beans are defined. For this example, you'll define three of
them (see Code Listing 8).</p>

<p><b>Code Listing 8: Defining the application context:
applicationContext.xml</b></p>

<div>
<pre>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; 
&quot;http://www.springframework.org/dtd/spring-beans.dtd&quot;&gt;

&lt;beans&gt;
  &lt;bean id=&quot;<b>applicationContext</b>&quot; class=
&quot;org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder&quot; /&gt;

  <b>&lt;bean id=&quot;weatherSpringService&quot; 
        class=&quot;sample.spring.service.WeatherSpringService&quot;&gt;
    &lt;property name=&quot;weather&quot; ref=&quot;weatherBean&quot;/&gt;
  &lt;/bean&gt;

  &lt;bean id=&quot;weatherBean&quot; class=&quot;sample.spring.bean.Weather&quot;&gt;
    &lt;property name=&quot;temperature&quot; value=&quot;89.9&quot;/&gt;
    &lt;property name=&quot;forecast&quot; value=&quot;Sunny&quot;/&gt;
    &lt;property name=&quot;rain&quot; value=&quot;false&quot;/&gt;
    &lt;property name=&quot;howMuchRain&quot; value=&quot;0.2&quot;/&gt;
  &lt;/bean&gt;</b>
&lt;/beans&gt;
</pre></div>

<p>The first one is Axis2's hook into Spring's application context
(needed since AAR deployment is quite different from regular WAR
deployment). Next, you define the bean to which the services.xml
file points, which is the weatherSpringService bean that points to
the WeatherSpringService class. It has one field property that gets
initialized by the Spring Framework - weather. This will be set to
the weatherBean. The weatherBean is an instantiation of the Weather
class that holds information on the weather. Spring will initialize
it to the values shown above, and set the Weather object in the
WeatherSpringService class to the weatherBean instantiation. Thus,
when you deploy the Web service, you won't have to instantiate the
values because they'll already be set.</p>

<p>Next up is the SpringInit class.</p>
<a name="initializingspring" id="initializingspring"></a>
</div>
<div class="section">
<h3><a name="Initializing_the_Spring_Application_Context:_SpringInit"></a>Initializing the Spring Application Context: SpringInit</h3>

<p>Without the Spring application context being initialized
quickly, you'll run into problems. The SpringInit class initializes
the Spring application context on startup because it is a
ServiceLifeCycle class whose startUp method gets called upon
loading the class (and because its load-on-startup property is set
in the services.xml file). The only code worth mentioning in this
class is shown in Code Listing 9.</p>

<p><b>Code Listing 9: SpringInit's startUp method</b></p>

<div>
<pre>
    public void startUp(ConfigurationContext ignore,
                        AxisService service) {
        <b>ClassLoader classLoader = service.getClassLoader();
        ClassPathXmlApplicationContext appCtx = new
            ClassPathXmlApplicationContext</b>(new String[]
                                           {&quot;<b>applicationContext.xml</b>&quot;}, 
                                           false);
        <b>appCtx.setClassLoader(classLoader);
        appCtx.refresh();</b>
        if (logger.isDebugEnabled()) {
            logger.debug(&quot;\n\nstartUp() set spring classloader &quot; +
                         &quot;via axisService.getClassLoader() ... &quot;);
        }
    }
</pre></div>

<p>Note that this method retrieves the Spring class loader, and
creates an application context with applicationContext.xml as the
parameters. This new application context then gets the Spring class
loader as its class loader. The Spring Framework is now up and
ready for our WeatherSpringService.</p>
</div>
<div class="section">
<h3><a name="Build_and_Deploy_Using_Apache_Axis2_and_Tomcat"></a>Build and Deploy Using Apache Axis2 and Tomcat</h3>

<p>Your POJO is now ready for primetime within the Spring
Framework. Before you build, you'll first need to make sure the
axis2-spring-1.7.2.jar and spring.jar files are in the
project's <i>Axis2_HOME/lib</i> directory.</p>

<p><b>Note:</b> The service will not deploy if you add
the above .jar files to the service archive due to class loding
issues.</p>

<p>Now build the source and create an AAR file by typing: ant</p>

<p>It'll be created at <i>target/WeatherSpringService.aar</i>.
Copy it to
<i>&lt;tomcat-home&gt;/webapps/axis2/WEB-INF/services</i>, and
Axis2 should deploy it quickly.</p>

<p>Next, test the Web service to see whether Spring will really
initialize the weather data for you.</p>
<a name="testingrpc" id="testingrpc"></a>
</div>
<div class="section">
<h3><a name="Testing_Using_an_RPCServiceClient"></a>Testing Using an RPCServiceClient</h3>

<p>It's as simple as it was for the other Web service, except this
time type: ant rpc.client</p>

<p>Feel free to browse the code for this client in
src/client/WeatherSpringRPCClient.java. Essentially, this client
does the same thing as the client testing the WeatherService.
Except that this one skips the &quot;Setting the weather&quot; task since the
weather data should have already been set by the Spring framework
at startup.</p>

<p>Thus, you should get the following as output from the
client:</p>

<div>
<pre>
run.client:
    [javac] Compiling 1 source file to C:\axis2-1.7.2\samples\pojoguidespring\build\cl
asses
     <b>[java] Temperature               : 89.9
     [java] Forecast                  : Sunny
     [java] Rain                      : false
     [java] How much rain (in inches) : 0.2</b>
</pre></div>

<p>Which are exactly the values you set in the
applicationContext.xml file!</p>

<a name="jsr181pojows" id="jsr181pojows"></a>
</div>
<div class="section">
<h2><a name="SR_181_Annotation_support_with_POJO_Web_services"></a>SR 181 Annotation support with POJO Web services</h2>

<p>Got the JSR 181 annotated POJOs? Great. This section will show you how to package
them in to a jar format for easy pojo deployment with the help of Axis2 POJO deployer.
First create the JSR 181 Annotated class.</p>
<a name="jsr181definingservice" id="jsr181definingservice"></a>

<div class="section">
<h3><a name="Sample_JSR_181_POJO_Web_Service"></a>Sample JSR 181 POJO Web Service</h3>

<p>For example lets assume that our JSR 181 Annotated class is.
</p>

<div>
<pre>
@WebService(name=&quot;JSR181TestService&quot; targetNamespace=&quot;http://www.test.org/jsr181/Example&quot;)
@SOAPBinding(style=SOAPBinding.Style.RPC)
public class TestService {
    @WebMethod(operationName = &quot;echoMethod&quot;)
    public String echoString(@WebParam(name=&quot;stringIn&quot;)String s){
        return s;
    }
}
</pre></div>
    
<p>Compile this with the help of the Axis2 libs in to a jar file.
        Add one additional like to the axis2.xml to deploy jar files on the pojo directory
    </p>
    
<div>
<pre>
        Ex: &lt;deployer extension=&quot;.jar&quot; directory=&quot;pojo&quot; class=&quot;org.apache.axis2.deployment.POJODeployer&quot;/&gt;
    </pre></div>

<p>Create a pojo directory if its not already there under the Axis2 repository and put the JSR 181 Annotated
jar inside that and start Axis2. You will see the service up and running !!</p>

<a name="summary" id="summary"></a>
</div>
<div class="section">
<h2><a name="Summary"></a>Summary</h2>

<p>Apache Axis2 is an excellent way to expose your POJOs as Web
services. Spring adds greater flexibility to your POJOs by adding
beans support and initialization abilities, along with all the
other goodies provided by the Spring framework.</p>
<a name="furtherstudy" id="furtherstudy"></a>

<div class="section">
<h2><a name="For_Further_Study"></a>For Further Study</h2>

<p><a href="Axis2ArchitectureGuide.html">Axis2 Architecture</a></p>

<p>Introduction to Apache Axis2-<a class="externalLink" href="http://www.redhat.com/magazine/021jul06/features/apache_axis2/">http://www.redhat.com/magazine/021jul06/features/apache_axis2/</a></p>

<p><a class="externalLink" href="http://wso2.org/library/259">Working With Apache Axis2</a></p>

<p>Apache Tomcat-<a class="externalLink" href="http://tomcat.apache.org/">http://tomcat.apache.org</a></p>

<p>Spring Framework-<a class="externalLink" href="http://www.springframework.org/">http://www.springframework.org/</a></p>

</html>
                  </div>
            </div>
          </div>

    <hr/>

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

        
                </div>
    </footer>
        </body>
</html>