Учебник по веб-сервисам AXIS2

Добро пожаловать в учебное пособие Apache Axis2. Недавно я пытался обновить свои навыки в работе с Apache Axis2 с версии 1.3 до последней версии 1.5.4, но не смог найти никакого учебного пособия, которое было бы понятным и охватывало последний релиз. Именно это стало основой для моего поста о учебном пособии по веб-сервисам Axis2.

Учебное пособие Apache Axis2

Кому предназначено это учебное пособие?

Это учебное пособие предназначено для Java-программистов, которые заинтересованы в разработке и развертывании веб-сервисов с использованием Apache Axis2.

Предварительные требования

Цель этого учебного пособия – использовать Axis2 для создания веб-сервисов, вызова веб-сервиса с помощью программы-клиента на Java и тестирования веб-сервиса с использованием инструмента Soap UI. Для более легкого понимания учебного пособия необходимо иметь базовое представление о Java, веб-сервисах, XML, Ant и сервере приложений (Tomcat).

Используемое программное обеспечение и инструменты

  1. Java Development Kit (JDK) 1.6.0 (Tomcat 7 требует минимальной версии JDK 1.6)
  2. Apache Ant 1.7.0 (Axis2 требует минимальной версии 1.6.5)
  3. Apache Axis2 1.5.4 (бинарное распределение)
  4. Среда разработки Eclipse 3.6.1 (Вы также можете использовать другие среды разработки, например NetBeans)
  5. Apache Tomcat 7.0.8
  6. SoapUI для тестирования нашего веб-сервиса.
  7. Mac OS X 10.6.4 (Я работаю на Mac OS, но этот учебник должен работать и на других операционных системах, однако может потребоваться некоторое изменение при выполнении команд)

Настройка системы

  1. Скачайте последнюю версию Apache Tomcat. На данный момент последняя версия – 7.0.8, и именно ее я использую для этого учебника. Для работы требуется минимальная версия Java 1.6, так что убедитесь, что она установлена в вашей системе. Если Java 6 не установлена в вашей системе, сначала загрузите и установите ее с Загрузки Java SE. Скачайте zip-архив ядра Tomcat (apache-tomcat-7.0.8.zip) и разархивируйте его, чтобы установить его в вашей системе. Установите переменную среды JAVA_HOME, чтобы запускать и останавливать сервер.

  2. Скачайте Apache Axis2 1.5.4 Binary Distribution zip с Выпуски Apache Axis2. Этот шаг необходим для создания axis2.war, который будет развернут в tomcat, и для получения библиотек axis2 для использования в проектах.

  3. Распакуйте двоичное распределение zip Axis2 в любой удобный каталог. Перейдите в каталог axis2-1.5.4/webapp и выполните команду “ant create.war” для создания развертывания axis2.war в каталоге axis2-1.5.4/dist. Если у вас нет установленного Apache Ant, вы можете загрузить и установить его с Apache Ant – Двоичные распределения. Обратите внимание, что у меня возникли некоторые проблемы с axis2.war, загруженным из распределения War. Позже я выяснил, что в распределении War отсутствуют некоторые jar-файлы. В распределении War содержится всего 58 jar-файлов, тогда как в двоичном распределении – 63. (Мне лень искать, какие именно файлы отсутствуют.)

    $ ant create.war
    Buildfile: build.xml
    
    init:
        [mkdir] Created dir: /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
          Copying 59 files to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
    
    prepare.repo:
          Copying 9 files to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF
        [mkdir] Created dir: /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf
          Copying 1 file to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp/WEB-INF/conf
    
    create.war:
          [war] Building war: /Users/pankaj/Downloads/axis2-1.5.4/dist/axis2.war
       [delete] Deleting directory /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
    
    BUILD SUCCESSFUL
    Total time: 2 seconds
    
  4. Разверните axis2.war на сервере приложений tomcat, скопировав его в директорию tomcat webapps. Возможно, вам придется перезагрузить сервер, если он не поддерживает горячее развертывание.

  5. Перейдите на https://localhost:8080/axis2/ и нажмите на ссылку Validate. Если страница Happy Axis отображается ЗЕЛЕНЫМ цветом, это означает, что axis2 успешно развернут. Наша система теперь готова, и мы можем приступить к созданию веб-сервисов Axis2.

Создание веб-сервиса Axis2

Для создания архива веб-сервиса Axis2 нам понадобится следующее:

  1. A Java Project (Axis2WSImplementation) with a class that will be exposed as a web service. In my example, I am exposing two operations from MyService class. The first operation getData input is String and returns String whereas the second operation getObjectData input is MyBean java object and returns MyBean java object after some data manipulation. Note that MyBean class implements Serializable interface so that it can be transferred over the network.
  2. Файл build.xml Ant, который будет использоваться для создания aar, wsdl, а также классов заглушки и обработчика обратного вызова на стороне клиента.
  3. Файл services.xml, который будет частью архива Axis2. Этот файл будет помещен в папку META-INF архива Axis2.

Структура проекта будет выглядеть как на изображении ниже. Не путайтесь с содержимым внутри папки build. Они будут созданы при выполнении файла build.xml Ant.

Объяснение проекта веб-сервиса Axis2

MyService.java: Класс реализации, который будет предоставлен в качестве веб-сервиса Axis2.

package com.journaldev.ws;

import com.journaldev.bean.MyBean;

public class MyService {

	public String getData(String input) {
		return "Hi" + input;
	}

	public MyBean getObjectData(MyBean myBean) {

		String name = myBean.getName();
		int id = myBean.getId();
		myBean.setId(id + 100);
		myBean.setName("Output: " + name);

		return myBean;
	}
}

MyBean.java: Класс Java Bean, который является входом и выходом операции getObjectData в веб-сервисе.

package com.journaldev.bean;

import java.io.Serializable;

public class MyBean implements Serializable {

	private static final long serialVersionUID = -1129402159048345204L;

	private String name;

	private int id;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

}

services.xml: Параметры, связанные с веб-сервисом Axis2, являются частью этого xml-файла. Параметр ServiceClass указывает класс, который будет предоставлен в виде веб-сервиса. Другие важные параметры – targetNamespace и schemaNamespace. services.xml

<service name="MyService" scope="application" targetNamespace="https://journaldev.com/">
 <description>
 MyService
 </description>
 <messageReceivers>
 <messageReceiver mep="https://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
 <messageReceiver mep="https://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
 </messageReceivers>
 <schema schemaNamespace="https://journaldev.com/xsd"/>
 <parameter name="ServiceClass">com.journaldev.ws.MyService</parameter>
</service>

build.xml: Файл сборки Ant для выполнения задач Axis2. Определены три цели, детали которых следующие:

  1. generate.wsdl: Эта цель генерирует файл MyService.wsdl в папке сборки. Убедитесь, что targetNamespace и schemaTargetNamespace совпадают с файлом service.xml.
  2. generate.service: Эта цель генерирует архив axis2 в папке сборки. В архив включен файл services.xml, а имя архива – MyService.aar
  3. generate.client: Эта цель генерирует классы для клиента. Убедитесь, что вы выполнили это после выполнения generate.wsdl, чтобы файл MyService.wsdl присутствовал в папке сборки.

build.xml

<project name="AxisWSImplementation" basedir="." default="generate.service">

 <property environment="env"/>
 <property name="build.dir" value="build"/>

 <path id="axis2.classpath">
 <fileset dir="${basedir}/lib">
 <include name="*.jar"/>
 </fileset>
 </path>

 <target name="compile.service">
 <mkdir dir="${build.dir}"/>
 <mkdir dir="${build.dir}/classes"/>
 <mkdir dir="${build.dir}/resources"/>
 <!--First let's compile the classes-->
 <javac debug="on"
 fork="true"
 destdir="${build.dir}/classes"
 srcdir="${basedir}/src"
 classpathref="axis2.classpath">
 </javac>
 </target>

 <target name="generate.wsdl" depends="compile.service">
 <taskdef name="java2wsdl"
 classname="org.apache.ws.java2wsdl.Java2WSDLTask"
 classpathref="axis2.classpath"/>
 <java2wsdl className="com.journaldev.ws.MyService"
 outputLocation="${build.dir}"
 targetNamespace="https://journaldev.com/"
 schemaTargetNamespace="https://journaldev.com/xsd">
 <classpath>
 <pathelement path="${axis2.classpath}"/>
 <pathelement location="${build.dir}/classes"/>
 </classpath>
 </java2wsdl>
 </target>

 <target name="generate.service" depends="compile.service">
 <copy toDir="${build.dir}/classes" failonerror="false">
 <fileset dir="${basedir}/resources">
 <include name="**/*.xml"/>
 </fileset>
 </copy>
 <jar destfile="${build.dir}/MyService.aar">
 <fileset excludes="**/Test.class" dir="${build.dir}/classes"/>
 </jar>
 </target>

 <target name="generate.client" depends="compile.service">
 <taskdef name="wsdl2java"
 classname="org.apache.axis2.tool.ant.AntCodegenTask"
 classpathref="axis2.classpath"/>
 <wsdl2java
 wsdlfilename="${build.dir}/MyService.wsdl"
 output="${build.dir}/resources" />
 </target>

 <target name="clean">
 <delete dir="${build.dir}"/>
 </target>
</project>

Генерация WSDL, Axis Archive и Stub Files

  • Выполните цель generate.wsdl ant для создания файла MyService.wsdl.
  • Выполните цель generate.service ant для создания файла MyService.aar.
  • Выполните цель generate.client ant для создания классов Stub.

Развертывание веб-сервиса Axis2

Скопируйте файл MyService.aar в каталог ~apache-tomcat-7.0.8/webapps/axis2/WEB-INF/services. Axis2 поддерживает горячее развертывание служб, поэтому вам не нужно перезапускать сервер. Проверьте развертывание вашей службы на странице ListServices (https://localhost:8080/axis2/services/listServices). MyService должен быть перечислен там с двумя операциями.

Тестирование веб-сервиса Axis2

После развертывания службы сначала нам нужно протестировать ее. Здесь я использую SoapUI, который является одним из лучших инструментов для тестирования веб-сервисов. Если у вас его нет, вы можете скачать его с их веб-сайта и легко установить. Шаги для тестирования с помощью SoapUI

  1. Создайте новый проект SoapUI с именем проекта MyServiceTest (можете дать любое имя, которое хотите) и начальным WSDL/WADL https://localhost:8080/axis2/services/MyService?wsdl (Этот URL можно получить на странице списка сервисов Axis2 после нажатия на ссылку MyService.). Оставьте другие опции со значениями по умолчанию и нажмите кнопку OK, чтобы создать проект тестирования SoapUI.
  2. Выберите любое из привязок SOAP и дважды кликните по запросам SOAP getData и getObjectData.
  3. Укажите некоторые значения для ввода в запрос и отправьте его на URL конечной точки веб-сервиса. Вы должны получить вывод от сервиса, похожий на изображение ниже. Это подтверждает, что наш веб-сервис работает и функционирует.

Теперь мы перейдем к последнему заданию вызова веб-сервиса с использованием классов заглушек Axis2.

Вызов веб-сервиса Axis2 с использованием файлов заглушек

  1. Создайте Java проект Axis2Client в Eclipse.
  2. Создайте папку lib и скопируйте все jar-файлы Axis2 из папки lib скачанного двоичного распределения. Добавьте эти jar-файлы в путь сборки проекта.
  3. Скопируйте ранее сгенерированные файлы MyServiceStub.java и MyServiceCallbackHandler.java в папку src проекта с правильной структурой пакетов. В моем случае я скопировал их в пакет com.journaldev. Если вам нужно предоставить эти классы кому-то еще, я настоятельно рекомендую создать из них jar-файл и распространять его вместе с другими, чтобы избежать любых изменений.
  4. Создайте класс клиента Axis2ClientUsingStubsFromAnt для вызова операций веб-сервиса. Структура проекта будет выглядеть примерно так, как на изображении ниже.

Код Axis2ClientUsingStubsFromAnt

package com.journaldev.ws.client;

import java.rmi.RemoteException;

import com.journaldev.MyServiceStub;
import com.journaldev.MyServiceStub.GetData;
import com.journaldev.MyServiceStub.GetDataResponse;
import com.journaldev.MyServiceStub.GetObjectData;
import com.journaldev.MyServiceStub.GetObjectDataResponse;
import com.journaldev.MyServiceStub.MyBean;

/**
 *
 * @author Pankaj - www.journaldev.com This class will invoke Axis2 web service
 *         operations using Stub classes
 *
 */
public class Axis2ClientUsingStubsFromAnt {

	/**
	 * END_POINT is the web service endpoint
	 */
	private final static String END_POINT = "https://localhost:8080/axis2/services/MyService";

	public static void main(String[] args) throws RemoteException {
		System.out.println("START");

		// Создание объекта Stub, передавая URL конечной точки веб-сервиса
		MyServiceStub stub = new MyServiceStub(END_POINT);

		// Создание входного объекта для операции getData
		GetData getDataInput = new GetData();

		// Установка входной части входного объекта для операции getData
		getDataInput.setInput("PANKAJ");

		// Вызов операции getData
		GetDataResponse getDataOutput = stub.getData(getDataInput);

		// Метод get_return возвращает объект вывода веб-сервиса. В данном случае это
		// строка, поэтому мы можем
		// напрямую вывести возвращенное значение
		System.out.println("Output:" + getDataOutput.get_return());

		// Создание входного объекта для операции getObjectData
		GetObjectData getObjectDataInput = new GetObjectData();
		MyBean myBean = new MyBean();
		myBean.setId(1);
		myBean.setName("KUMAR");

		// Установка входной части входного объекта для операции getObjectData
		getObjectDataInput.setMyBean(myBean);

		// Вызов операции getObjectData
		GetObjectDataResponse getObjectDataOutput = stub
				.getObjectData(getObjectDataInput);

		// Получение объекта MyBean из объекта ответа
		MyBean myBeanOutput = getObjectDataOutput.get_return();

		// Вывод значений myBeanOutput для проверки вызова операций веб-сервиса
		// Запуск класса Axis2ClientUsingStubsFromAnt для вызова веб-сервиса. Результат выполнения программы:
		System.out.println("ID:" + myBeanOutput.getId() + "NAME:"
				+ myBeanOutput.getName());

		System.out.println("DONE");

	}

}

START
log4j:WARN No appenders could be found for logger (org.apache.axis2.description.AxisService).
log4j:WARN Please initialize the log4j system properly.
Output:HiPANKAJ
ID:101NAME:Output: KUMAR
DONE

Если вы нашли учебное пособие полезным для понимания Axis2 и начала работы с ним, пожалуйста, поделитесь своими мыслями в разделе комментариев. И да, не забудьте поделиться им с другими. Ваши два клика и 5 секунд времени могут помочь кому-то еще легко освоить Axis2. 🙂

Source:
https://www.digitalocean.com/community/tutorials/axis2-web-services-tutorial