blob: aadf487ad58118034ea92f9cba4ffb7c8b22c987 [file] [log] [blame]
<!DOCTYPE html>
<!--
| Generated by Apache Maven Doxia Site Renderer 1.7.4 at 2017-07-30
| 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="20170730" />
<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: 2017-07-30<span class="divider">|</span>
</li>
<li id="projectVersion">Version: 1.7.6<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>
<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>
</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" >
<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.6-bin and 1.7.6-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.6 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.6-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.6-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.6.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.6\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;2017
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.</p>
</div>
</div>
</footer>
</body>
</html>