Создание Веб-сервиса с помошью Axis2
Axis2 является следующим развитием проeкта Axis, Axis2 стал еще быстрее и что важно у него появилась возможность легко обмениваться сложными типами. Информации не так много, поэтому хочу поделится с Вами своим небольшим опытом.
1.Инсталяция
Инсталляция Axis2 включает два файла axis2.war – веб контейнер axis2-std-<version>-bin.zip
Важное замечание --------------------------------------------------------------- странно, но файлы представленные на сайте Axis2 под версией 1.0 не вполне работоспособные, при их использовании у меня выдавался эксепшн data binding error. Я попробовал взять последный ночной билд – и с ним все заработало (снапшот от 29 июня 2006г) http://people.apache.org/dist/axis2/nightly/ ---------------------------------------------------------------
Необходимо: - Разжать axis2-std-<version>-bin.zip и положить в любую папку (Например C:/libs/axis2) - Добавить эту папку в переменную окружения AXIS2_HOME - Добавить папку axis2/bin в переменную окружения PATH - Положить axis2.war в папку для war файлов на сервере приложения (например $TOMCAT_HOME$/webapps) - Проверить, что приложение работает (http://localhost:8080/axis2).
2. Создание серверной части 2.1 Создание заготовки Для этого необходимо создать заготовку класса на основе которого будет генериться вебсервис для демонстрации возможностей Axis2 будем обмениваться сложными типами (я придумал собственный класс License) для этого надо создать пакет, например "x4444", в нем: создать класс License содержащий два поля int id и String name и геттеры и сеттеры для них. И создать класс LicDB – содержащий массив объектов License и геттер, возвращающий один объект по его индексу.
Код: License.java
Код | package x4444;
public abstract class License { private int id; private String name;
public abstract void setID(int id); public abstract void setName(String name); public abstract int getID(); public abstract String getName(); }
|
Код: LicDB.java
Код | package x4444;
public abstract class LicDB { private x4444.License [] license; public abstract x4444.License getLicense(int i); }
|
откомпилируем классы.
2.2 Создадим WSDL на основе класса LicDB
$ Java2WSDL -cn x4444.LicDB -cp . -sn LicDB получим файл LicDB.wsdl следующго содержания
Код | <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:axis2="http://x4444" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:ns1="http://x4444/xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="http://x4444"><wsdl:types><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns="http://x4444/xsd" targetNamespace="http://x4444/xsd" elementFormDefault="unqualified" attributeFormDefault="unqualified"> <xs:element type="ns:License" name="License" /> <xs:complexType name="License"> <xs:sequence> <xs:element type="xs:int" name="iD" /> <xs:element type="xs:string" name="name" /> </xs:sequence> </xs:complexType> <xs:element name="getLicense"> <xs:complexType> <xs:sequence> <xs:element type="xs:int" name="param0" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getLicenseResponse"> <xs:complexType> <xs:sequence> <xs:element type="ns:License" name="return" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema></wsdl:types><wsdl:message name="getLicenseMessage"><wsdl:part element="ns1:getLicense" name="part1" /></wsdl:message><wsdl:message name="getLicenseResponseMessage"><wsdl:part element="ns1:getLicenseResponse" name="part1" /></wsdl:message><wsdl:portType name="LicDBPortType"><wsdl:operation name="getLicense"><wsdl:input message="axis2:getLicenseMessage" /><wsdl:output message="axis2:getLicenseResponseMessage" /></wsdl:operation></wsdl:portType><wsdl:binding type="axis2:LicDBPortType" name="LicDBSOAP11Binding"><soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /><wsdl:operation name="getLicense"><soap:operation style="document" soapAction="urn:getLicense" /><wsdl:input><soap:body namespace="http://x4444" use="literal" /></wsdl:input><wsdl:output><soap:body namespace="http://x4444" use="literal" /></wsdl:output></wsdl:operation></wsdl:binding><wsdl:binding type="axis2:LicDBPortType" name="LicDBSOAP12Binding"><soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /><wsdl:operation name="getLicense"><soap12:operation style="document" soapAction="urn:getLicense" /><wsdl:input><soap12:body namespace="http://x4444" use="literal" /></wsdl:input><wsdl:output><soap12:body namespace="http://x4444" use="literal" /></wsdl:output></wsdl:operation></wsdl:binding><wsdl:service name="LicDB"><wsdl:port binding="axis2:LicDBSOAP11Binding" name="LicDBSOAP11port"><soap:address location="http://localhost:8080/axis2/services/LicDB" /></wsdl:port><wsdl:port binding="axis2:LicDBSOAP12Binding" name="LicDBSOAP12port"><soap12:address location="http://localhost:8080/axis2/services/LicDB" /></wsdl:port></wsdl:service></wsdl:definitions>
|
2.3 Создание скелета вебсервиса и другие вспомогательных файлов
для этого необходимо выполнить команду $ WSDL2Java -uri LicDB.wsdl -ss -sd -d xmlbeans -o out
сгенерированные классы появятся в папке out (там будет папка resources, папка src и файл build.xml)
2.4. Наполнение скелета для того чтобы веб-сервис работал необходимо наполнить скелет вебсервиса файл src/x4444/LicDBSkeleton.java
Код | package x4444;
import x4444.xsd.GetLicenseResponseDocument; import x4444.xsd.License; import x4444.xsd.GetLicenseResponseDocument.GetLicenseResponse;
public class LicDBSkeleton{
License [] licArr; public LicDBSkeleton() { licArr = new License [2]; licArr[0] = License.Factory.newInstance(); licArr[1] = License.Factory.newInstance(); licArr[0].setID(0); licArr[0].setName("A"); licArr[1].setID(1); licArr[1].setName("B"); } public x4444.xsd.GetLicenseResponseDocument getLicense (x4444.xsd.GetLicenseDocument param0 ) { int i = param0.getGetLicense().getParam0(); License lic = null; //set values if (i>=0 && i<licArr.length) { lic = licArr[i]; } else { lic = License.Factory.newInstance(); lic.setID(-1); lic.setName("id is out of range"); } GetLicenseResponse licResp = GetLicenseResponse.Factory.newInstance();
//set lic licResp.setReturn(lic); GetLicenseResponseDocument respDoc = GetLicenseResponseDocument.Factory.newInstance(); //set licResp respDoc.setGetLicenseResponse(licResp); return respDoc; } }
|
Создание вебсервиса закончено.
2.5 Сборка и упаковка для этого просто запустим готовый ant сценарий сборки из папки out (там где файл build.xml) $ ant
получим папку build, в ней файл lib\LicDB.aar
в архив входят - сгенеренные классы пакета x4444 - папка schemaorg_apache_xmlbeans и все ее содержимое - папка META-INF с файлами services.xml и LicDB.wsdl
2.6 Деплоймент
Необходимо зайти на страницу http://localhost:8080/axis2 потом в раздел Administration логин: admin пароль: axis2 Выбрать Upload Service – выбрать Service Archive файл LicDB.aar – Upload через несколько секунд архив распакуется и сервис активируется.
Проверить что сервис поднялся можно здесь же в разделе Avaliable Services - имя сервиса LicDB
wsdl сервиса тоже можнопосмотреть нажав на заглание сервиса LicDB http://localhost:8080/axis2/services/LicDB?wsdl
3. Клиентская часть
3.1 Генерация стаба
Для этого необходимо выполнить комманду $ WSDL2Java -uri LicDB.wsdl -d xmlbeans -o client
В папке "сlient" появятся сгенерированные папки и файлы (resources, src, build xml);
Для теста необходимо создать новый класс Test (можно прям без пакета) чтобы протестировать работоспособность вебсервиса
Test.java
Код | import x4444.*; import x4444.xsd.*; import x4444.xsd.GetLicenseDocument.GetLicense;
public class Test { public static void main(String[] args) { try { LicDBStub stub = new LicDBStub(null, "http://localhost:8080/axis2/services/LicDB"); GetLicense lic = GetLicense.Factory.newInstance(); GetLicenseDocument licDoc = GetLicenseDocument.Factory.newInstance(); //set licDoc.setGetLicense(lic); GetLicenseResponseDocument respDoc = null; //set for (int i = 0; i<3; i++) { //set licDoc.getGetLicense().setParam0(i); respDoc = stub.getLicense(licDoc); System.out.println(respDoc.getGetLicenseResponse().getReturn().getID()); System.out.println(respDoc.getGetLicenseResponse().getReturn().getName()); System.out.println("----------------------------------------------------"); } } catch (Exception e) { System.out.println(e.getMessage()); } } }
|
Выполнять наверное лучше под какой-либо средой (напрмер Eclipse). т.к. иначе придестся прописывать jar'ы axis2 в CLASSPATH, а в Eclipse можно быстренько создать User Library – Axis2 и включить в нее все jar'ы из папки $AXIS2_HOME$/lib и включить эту User Library в проект
4. Результат выполнения:
0 A ---------------------------------------------------- 1 B ---------------------------------------------------- -1 id is out of range ----------------------------------------------------
* Впринципе наполнение скелета, жарку, создание клиентского кода можно делать в какой-либо среде (Я делал в эклипсе). помимо пользовательской библиотеки Axis2 в проект необходимо включать Class Folder - resourses т.о. чтобы schemaorg_apache_xmlbeans и все что под ним было видно при билде.
официальная документация - http://ws.apache.org/axis2/1_0/userguide.html
|