blob: 65bb5d940ff3faa4da1d416eafb20cc18f3958b0 [file] [log] [blame]
Axis2 JAX-WS sample that uses JAXB artifacts created from a simple schema.
1. Given a simple schema, generate the JAXB artifacts using xjc.
2. With the generated JAXB beans in hand, write the service implementation
and add annotations to make a Web Service.
3. Write a Dispatch client to interact with the service
4. Run the Dispatch client against the service implementation deployed in the Axis2 server
This address book sample is based on one of the jaxws-integration tests:
modules/jaxws-integration/test/org/apache/axis2/jaxws/sample/addressbook
Note that this is a very simple example, and does not persist any data. The intent is
to illustrate the use of JAXB objects with JAX-WS, not to actually implement and address book.
The following source is included with this example:
src\AddressBookEntry.xsd: Schema used to generate JAXB artifacts
src\org\apache\axis2\jaxws\addressbook\AddressBook.java: JAXWS Service Endpoint Interface (SEI)
Note that this SEI is NOT CURRENTLY USED in this example.
src\org\apache\axis2\jaxws\addressbook\AddressBookClient.java: JAXWS Dispatch Client
src\org\apache\axis2\jaxws\addressbook\AddressBookImpl.java: JAXWS service implementation
Step 0: How to build this sample
================================
To build this sample, execute the following maven command:
mvn clean install
This will do the following:
- Generate the JAXB artifacts (in target/schema)
- Compile the service implementation classes (in target/classes), including the JAXB artifacts,
and create a JAR containing those classes (target/jaxws-addressbook-SNAPSHOT.jar)
- Compile the Dispatch client classes (in target/classes) and create a JAR containing those classes
(target/jaxws-addressbook-SNAPSHOT-Client.jar).
Step 1: Generate JAXB artifacts from simple schema
==================================================
The file src/AddressBookEntry.xsd describes a simple AddressBookEntry object with the
following fields:
String firstName;
String lastName;
String phone;
String street;
String city;
String state;
The following JAXB artifacts are generated in the target/schema/src directory when the
sample is built
org\apache\axis2\jaxws\addressbook\AddressBookEntry.java
org\apache\axis2\jaxws\addressbook\ObjectFactory.java
org\apache\axis2\jaxws\addressbook\package-info.java
These files will be compiled into target/classes as part of the build.
Step 2: Write a JAX-WS service implementation using the JAXB artifacts
======================================================================
The simple service implementation will have two methods on it:
public String addEntry(String firstName, String lastName, String phone, String street, String city, String state)
public AddressBookEntry findByLastName(String lastName)
The service implementation does not explicitly specify a JAX-WS SEI. The public methods on the
implementation will be an implicit SEI. Simply by adding an @WebService annotation to the
implementation class it becomes a JAX-WS web service.
The implementation class is: src\org\apache\axis2\jaxws\addressbook\AddressBookImpl.java
This file will be compiled into target/classes as part of the build.
Step 3: Write a JAX-WS Dispatch client to interact with the service
===================================================================
The extremely simple Dispatch client will be a Payload mode String Dispatch client, meaning that
it will provide the exact SOAP body to send in the request (Payload mode) as a String, and expect
the response to be a SOAP body returned as a String. It will invoke both methods on the
service implenetation's implicit SEI.
The dispatch client class is: src\org\apache\axis2\jaxws\addressbook\AddressBookClient.java
This file will be compiled into target/classes as part of the build.
Step 4: Run the Dispatch client against the service implementation deployed in the Axis2 server
===============================================================================================
(a) Setup your environment to run the sample. You will need two windows, one for the server
and one for the client. Each needs the following environment variables set:
- Axis2 binary distribution. For example: AXIS2_HOME=C:\temp\Axis2\axis2-SNAPSHOT
- Java5 JDK. For example: JAVA_HOME=c:\java\java5
(b) Copy the service implementation JAR file from the sample target directory to the appropriate
Axis2 repository directory, %AXIS2_HOME%\repository\servicejars. Note that JAR files in this
directory will be deployed into the Axis2 simple server using only annotations on classes
within the JARs; no deployment descriptor is required.
If the repository directory does not exist, create it first, then copy the service
implementation JAR:
mkdir %AXIS2_HOME%\repository\servicejars
copy target\jaxws-addressbook-SNAPSHOT.jar %AXIS2_HOME%\repository\servicejars
(c) Start the axis2 server. This will deploy the JAX-WS service implementation.
cd %AXIS2_HOME%
bin\axis2server.bat
You should see a message such as:
[INFO] Deploying artifact : jaxws-addressbook-SNAPSHOT.jar
[INFO] Deploying JAXWS annotated class org.apache.axis2.jaxws.addressbook.AddressBookImpl as a service - AddressBookImplService.AddressBookImplPort
(d) From another window with the environment setup, in the jaxws-addressbook samples directory run
the Dispatch client:
java -Djava.ext.dirs=%AXIS2_HOME%\lib;%JAVA_HOME%\jre\lib\ext -cp target/classes org.apache.axis2.jaxws.addressbook.AddressBookClient.class
You should see something like the following in the client window:
>> Invoking sync Dispatch for AddEntry
Add Entry response: <dlwmin:addEntryResponse xmlns:dlwmin="http://addressbook.jaxws.axis2.apache.org/"><return xmlns:ns2
="http://addressbook.jaxws.axis2.apache.org">AddEntry Completed!</return></dlwmin:addEntryResponse>
>> Invoking Dispatch for findByLastName
Find response: <dlwmin:findByLastNameResponse xmlns:dlwmin="http://addressbook.jaxws.axis2.apache.org/"><return xmlns:ns
2="http://addressbook.jaxws.axis2.apache.org"><firstName>firstName</firstName><lastName>lastName</lastName><phone>phone<
/phone><street>street</street><city>city</city><state>state</state></return></dlwmin:findByLastNameResponse>