Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание Веб-сервиса с помощью Axis2, Создание Веб-сервиса с помощью Axis2 
:(
    Опции темы
x4444
Дата 29.6.2006, 19:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 7.2.2006

Репутация: 1
Всего: 1



Создание Веб-сервиса с помошью 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 
PM MAIL   Вверх
seth
Дата 12.12.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 4.6.2006

Репутация: 1
Всего: 1



была ошибка (забыл подключить schemaorg_apache_xmlbeans...)

Это сообщение отредактировал(а) seth - 12.12.2006, 17:55


--------------------
PM MAIL   Вверх
batigoal
Дата 13.12.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Статья добавлена в FAQ.

seth, спасибо.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
seth
Дата 15.12.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 4.6.2006

Репутация: 1
Всего: 1



Что то не очень удобно стало использовать axis2 по сравнению с axis - появляется множество ненужных интерфейсов (
Код

GetLicense lic = GetLicense.Factory.newInstance();
            GetLicenseDocument licDoc = GetLicenseDocument.Factory.newInstance();

)
Зачем они нужны??
когда в axis
Код

        double result;
        SubstractionServiceServiceLocator sssl = new SubstractionServiceServiceLocator();
        SubstractionService ss = sssl.getSubstractionService();
        result = ss.subtract(45.6, 22.8);
        System.out.println("Result = " + result);


либо
Код

    String endpoint = "http://localhost:8080/axis/SubstractionService.jws";

    Service service = new Service();
    Call call = (Call)service.createCall();
    call.setTargetEndpointAddress(new URL(endpoint));

    Object[] params = new Object[]{ 45.6,  22.8};

    Double response = (Double) call.invoke("subtract", params);
    System.out.println("Response "+response);



Что как мне кажется намного удобнее и проще....

Но вроде как axis2 быстрее... Может и в axis2 можно так по простому использовать сервисы?


--------------------
PM MAIL   Вверх
seth
Дата 18.12.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 4.6.2006

Репутация: 1
Всего: 1



Ладно пока думают над предидущим вопросом спрошу еще 1:
из каких языков можно использовать веб сервисы на axis2??


--------------------
PM MAIL   Вверх
rrrookie
Дата 22.12.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 21.6.2006
Где: Rīga

Репутация: нет
Всего: нет



ОченЬ толковое описане - супер!
Но когда попробовал повторритЬ и правда при запуске система ругается на schemaorg_apache_xmlbeans

Кто нитЬ обяснит что значит "подключить schemaorg_apache_xmlbeans" ?
PM MAIL   Вверх
seth
Дата 22.12.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 4.6.2006

Репутация: 1
Всего: 1



Цитата(rrrookie @ 22.12.2006,  13:13)
ОченЬ толковое описане - супер!
Но когда попробовал повторритЬ и правда при запуске система ругается на schemaorg_apache_xmlbeans

Кто нитЬ обяснит что значит "подключить schemaorg_apache_xmlbeans" ?

Ну добавить в проект (я помоему просто скопировал в папку с сырцами)


--------------------
PM MAIL   Вверх
rrrookie
Дата 22.12.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 21.6.2006
Где: Rīga

Репутация: нет
Всего: нет



Хмммм....

seth, ты не мог бы прислатЬ как выглядит твой проект? в каком месте лежит  schemaorg_apache_xmlbeans?? 

у меня -> <project_root>/resources/schemaorg_apache_xmlbeans ??? 

И при етом вылетает вот такой вот красавец -> 

Exception in thread main
java.lang.ExceptionInInitializerError: java.lang.RuntimeException
    at lv.mebius.ws.xsd.GetPersonByNameDocument$GetPersonByName$Factory.newInstance(GetPersonByNameDocument.java:85)
    at lv.mebius.ws.Client.main(Client.java:29)
Caused by: java.lang.RuntimeException: Cannot load SchemaTypeSystem. Unable to load class with name schemaorg_apache_xmlbeans.system.s866A7980FB54643CD10F1B371397DA53.TypeSystemHolder. Make sure the generated binary files are on the classpath.
    at org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(XmlBeans.java:783)
    at lv.mebius.ws.xsd.GetPersonByNameDocument$GetPersonByName.<clinit>(GetPersonByNameDocument.java:44)
    ... 2 more
Caused by: java.lang.ClassNotFoundException: schemaorg_apache_xmlbeans.system.s866A7980FB54643CD10F1B371397DA53.TypeSystemHolder
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(XmlBeans.java:769)
    ... 3 more



PM MAIL   Вверх
seth
Дата 22.12.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 4.6.2006

Репутация: 1
Всего: 1



Ну если использовать идею то он у меня лежит в <project-root>/schemaorg_apache_xmlbeans


--------------------
PM MAIL   Вверх
rrrookie
Дата 22.12.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 21.6.2006
Где: Rīga

Репутация: нет
Всего: нет



Уверен? 

а не под <project-root>/src/schemaorg_apache_xmlbeans  ? 
PM MAIL   Вверх
rrrookie
Дата 27.12.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 21.6.2006
Где: Rīga

Репутация: нет
Всего: нет



Мне интересно, у кому нитЬ удалосЬ запуститЬ описанного выше киента?

у меня например вот такой эксепшн в  Test.java в етом вот месте -> 

Код

...
GetLicense lic = GetLicense.Factory.newInstance();
...



Exception in thread main
java.lang.ExceptionInInitializerError: java.lang.RuntimeException
    at x4444.xsd.GetLicenseDocument$GetLicense$Factory.newInstance(GetLicenseDocument.java:85)
    at Test.main(Test.java:11)
Caused by: java.lang.RuntimeException: Cannot load SchemaTypeSystem. Unable to load class with name schemaorg_apache_xmlbeans.system.sE4765D088B0EC9D7783B13B6B493A636.TypeSystemHolder. Make sure the generated binary files are on the classpath.
    at org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(XmlBeans.java:783)
    at x4444.xsd.GetLicenseDocument$GetLicense.<clinit>(GetLicenseDocument.java:44)
    ... 2 more
Caused by: java.lang.ClassNotFoundException: schemaorg_apache_xmlbeans.system.sE4765D088B0EC9D7783B13B6B493A636.TypeSystemHolder
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(XmlBeans.java:769)
    ... 3 more

Помогите плз

Это сообщение отредактировал(а) rrrookie - 27.12.2006, 11:58
PM MAIL   Вверх
aburkin
Дата 16.7.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.7.2007

Репутация: нет
Всего: нет



вот какая проблема.

есть класс (используется axis2 и юзать надо jibx)

Код

package samples.quickstart.service.jibx;

import java.util.HashMap;

public class StockQuoteService{
    private HashMap map = new HashMap();

    public void update(String symbol, Double price) {
        map.put(symbol, price);
    }

    public Double getPrice(String symbol) {
        Double ret = (Double) map.get(symbol);
        if (ret == null) {
            ret = new Double(42.0);
        }
        return ret;
    }
}


при дальнейшей его реализиции в веб-сервис и написание клиента, трабл в следующем:
после вызова update(String symbol, Double price) клиентом,  затем getPrice(String symbol), никаких изменений нету =(
во многих местах написано, что нужно использовать setManageSession(true);

у меня так и не получилось =( кто с этим сталкивался, напишите как решили проблему, плз =)



PM MAIL   Вверх
aburkin
Дата 17.7.2007, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.7.2007

Репутация: нет
Всего: нет



https://issues.apache.org/jira/browse/AXIS2-2042

так кто как с этим справился?
PM MAIL   Вверх
aburkin
Дата 18.7.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.7.2007

Репутация: нет
Всего: нет



решение проблемы тут:
http://ws.apache.org/axis2/1_2/migration.html#transports

Это сообщение отредактировал(а) aburkin - 18.7.2007, 10:49
PM MAIL   Вверх
aburkin
Дата 18.7.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.7.2007

Репутация: нет
Всего: нет



не, нужно в файле service.xml отредактировать строчку (добивить то, что жирным)
<service name="MathService" scope="application">
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.