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

      <div id="breadcrumbs">
        <ul class="breadcrumb">
        <li id="publishDate">Last Published: 2021-08-01<span class="divider">|</span>
</li>
          <li id="projectVersion">Version: 1.8.0<span class="divider">|</span></li>
        <li class=""><a href="http://www.apache.org" class="externalLink" title="Apache">Apache</a><span class="divider">/</span></li>
      <li class=""><a href="../index.html" title="Axis2/Java">Axis2/Java</a><span class="divider">/</span></li>
    <li class="active ">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.8.0.html" title="1.8.0"><span class="none"></span>1.8.0</a>  </li>
      </ul>
  </li>
    <li><a href="../modules/index.html" title="Modules"><span class="none"></span>Modules</a>  </li>
    <li><a href="../tools/index.html" title="Tools"><span class="none"></span>Tools</a>  </li>
          <li class="nav-header">Documentation</li>
    <li><a href="../docs/toc.html" title="Table of Contents"><span class="none"></span>Table of Contents</a>  </li>
    <li><a href="../docs/installationguide.html" title="Installation Guide"><span class="none"></span>Installation Guide</a>  </li>
    <li><a href="../docs/quickstartguide.html" title="QuickStart Guide"><span class="none"></span>QuickStart Guide</a>  </li>
    <li><a href="../docs/userguide.html" title="User Guide"><span class="none"></span>User Guide</a>  </li>
    <li><a href="../docs/jaxws-guide.html" title="JAXWS Guide"><span class="none"></span>JAXWS Guide</a>  </li>
    <li 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="../git.html" title="Checkout the Source"><span class="none"></span>Checkout the Source</a>  </li>
    <li><a href="../mail-lists.html" title="Mailing Lists"><span class="none"></span>Mailing Lists</a>  </li>
    <li><a href="../release-process.html" title="Release Process"><span class="none"></span>Release Process</a>  </li>
    <li><a href="../guidelines.html" title="Developer Guidelines"><span class="none"></span>Developer Guidelines</a>  </li>
    <li><a href="../siteHowTo.html" title="Build the Site"><span class="none"></span>Build the Site</a>  </li>
          <li class="nav-header">Project Information</li>
    <li><a href="../team-list.html" title="Project Team"><span class="none"></span>Project Team</a>  </li>
    <li><a href="../issue-tracking.html" title="Issue Tracking"><span class="none"></span>Issue Tracking</a>  </li>
    <li><a href="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 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>
<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>
<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>
<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
<code>getter</code> and <code>setter</code> 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>
<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>
<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>
</section><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.8.0-bin and 1.8.0-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.8.0 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.8.0-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.8.0-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>
<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>
<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>
</section><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>
<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>
</section><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>
</section><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>
</section><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.8.0.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>
</section><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.8.0\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>
</section><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>
<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>
</section><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>
<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;2021
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.</p>
        </div>
        </div>
    </footer>
    </body>
</html>