Поиск по сайту:

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


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

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

Кому следует использовать этот учебник?

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

Предпосылки

Целью этого руководства является использование Axis2 для создания веб-служб и вызова веб-службы с помощью клиентской программы Java, а также тестирование веб-службы с помощью инструмента пользовательского интерфейса Soap. Базовое понимание 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 IDE для разработки проектов (вы также можете использовать другую IDE, например NetBeans)
  5. Apache Tomcat 7.0.8
  6. SoapUI для тестирования нашего веб-сервиса.
  7. Mac OS X 10.6.4 (я работаю с Mac OS, но руководство должно подойти и для других операционных систем, однако при выполнении команд могут потребоваться некоторые изменения)

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

  1. Download the latest version of Java SE Downloads. Download the Tomcat Core zip (apache-tomcat-7.0.8.zip) and unzip it to install it on your system. Set the JAVA_HOME environment variable to start and stop the server.

  2. Download Apache Axis2 1.5.4 Binary Distribution zip from Apache Axis2 – Releases. This step is required to create axis2.war that will be deployed to tomcat and to get the axis2 libraries to be used in projects.

  3. Unzip the Axis2 binary distribution zip into any convenient directory. Go to axis2-1.5.4/webapp directory and run the “ant create.war” command to create the axis2.war deployment in the axis2-1.5.4/dist directory. If you don’t have Apache Ant installed, you can download and install it from Apache Ant – Binary Distributions. Please note that I was facing some issue with axis2.war downloaded from War Distribution. Later on, I found out that few jars are missing in the axis2 War Distribution. War Distribution contains only 58 jars whereas Binary Distribution contains 63 jars. (I am feeling lazy to find out, which jars are missing.)

    $ ant create.war
    Buildfile: build.xml
    
    init:
        [mkdir] Created dir: /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
         [copy] Copying 59 files to /Users/pankaj/Downloads/axis2-1.5.4/dist/temp
    
    prepare.repo:
         [copy] 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
         [copy] 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. Deploy the axis2.war in the tomcat application server by copying it in tomcat webapps directory. You may need to restart the server if it’s not supporting hot deployment.

  5. Go to https://localhost:8080/axis2/ and click on Validate link. If the Happy Axis page is coming with GREEN color then it means that axis2 is successfully deployed. Our system setup is ready now and we can proceed for creating Axis2 web services.

Создание веб-службы Axis2

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

  1. Проект Java (реализация Axis2WSI) с классом, который будет представлен как веб-служба. В моем примере я выставляю две операции из класса MyService. Ввод первой операции getData представляет собой строку и возвращает строку, тогда как ввод второй операции getObjectData представляет собой объект Java MyBean и возвращает объект Java MyBean после некоторой обработки данных. Обратите внимание, что класс MyBean реализует интерфейс Serializable, чтобы его можно было передавать по сети.
  2. Файл Ant build.xml, который будет использоваться для создания aar, wsdl и классов заглушек и обработчиков обратных вызовов на стороне клиента.
  3. файл services.xml, который будет частью архива оси 2. Этот файл будет помещен в папку META-INF архива оси 2.

Объяснение проекта веб-сервиса 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: эта цель создает архив оси 2 в папке сборки. Он включает в себя файл 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 и файлов-заглушек

  • Выполните команду generate.wsdl для создания файла MyService.wsdl.
  • Выполните команду generate.service ant target для создания файла MyService.aar.
  • Выполните команду generate.client ant target, чтобы сгенерировать классы-заглушки.

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

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

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

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

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

  1. Создайте Java-проект Axis2Client в Eclipse.
  2. Создайте папку lib и скопируйте все jar-файлы Axis2 из папки lib загруженного бинарного дистрибутива. Добавьте эти jar-файлы в путь сборки проекта.
  3. Скопируйте ранее сгенерированные файлы MyServiceStub.java и MyServiceCallbackHandler.java в источник проекта с правильной структурой пакета. В моем случае я скопировал их в пакет com.journaldev. Если вам нужно предоставить эти классы кому-то другому, я настоятельно рекомендую создать из них jar-файл, а затем распространить его среди других, чтобы избежать каких-либо модификаций.
  4. Создайте клиентский класс 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");

		// Create the Stub Object by passing the Web Service Endpoint URL
		MyServiceStub stub = new MyServiceStub(END_POINT);

		// Creating an input object for the getData operation
		GetData getDataInput = new GetData();

		// Setting the input part in the getData input object
		getDataInput.setInput("PANKAJ");

		// invoking the getData operation
		GetDataResponse getDataOutput = stub.getData(getDataInput);

		// get_return method returns the web service output object. Here its
		// String, so we can
		// directly print the returned value
		System.out.println("Output:" + getDataOutput.get_return());

		// Creating input object for the getObjectData operation
		GetObjectData getObjectDataInput = new GetObjectData();
		MyBean myBean = new MyBean();
		myBean.setId(1);
		myBean.setName("KUMAR");

		// Setting the input part in the getObjectData input object
		getObjectDataInput.setMyBean(myBean);

		// invoking the getObjectData operation
		GetObjectDataResponse getObjectDataOutput = stub
				.getObjectData(getObjectDataInput);

		// Get the MyBean object from the response object
		MyBean myBeanOutput = getObjectDataOutput.get_return();

		// Print the myBeanOutput values to check that web service operations
		// are getting invoked
		System.out.println("ID:" + myBeanOutput.getId() + "NAME:"
				+ myBeanOutput.getName());

		System.out.println("DONE");

	}

}

Выполните класс Axis2ClientUsingStubsFromAnt, чтобы вызвать веб-службу. Вывод вышеуказанной программы:

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. :)