Проектирование и разработка Web-сервисов JAX-WS 2.0

Использование технологии JAX-WS (Java™ API for XML Web Services) для проектирования и разработки Web-сервисов дает много преимуществ, включая упрощение создания Web-сервисов и их клиентов на языке Java, облегчение разработки и развертывания Web-сервисов, а также ускорение разработки Web-сервисов. В данном учебном руководстве рассматриваются эти и другие темы и разрабатывается пример приложения обработки заказов, отображающего свою функциональность в виде Web-сервисов. После прочтения данного руководства вы сможете применять изученные концепции и новые знания при разработке Web-сервисов в ваших приложениях, используя технологию JAX-WS.

Навин Балани (Naveen Balani), инженер по Web-технологиям, Webify Solutions

Навин Балани (Naveen Balani) в основном занимается проектированием и разработкой платформ и приложений, основанных на J2EE.Написал для IBM различные статьи на темы SOA, JMS, архитектуры Web-сервисов, CICS, AXIS, J2ME, DB2 и многие другие.


developerWorks Master author level
        3

Раджив Хати (Rajeev Hathi), старший системный аналитик, Satyam Computers Ltd.

Раджив Хати (Rajeev Hathi) в данный момент работает на должности старшего системного аналитика в компании Satyam Computers Ltd. Он проводит свое время, проектируя и разрабатывая среды на основе J2EE. Ему нравится исследовать новые технологии и новые области знания. Его хобби – музыка и спорт.


developerWorks Contributing author
        level

21.12.2009

Перед началом работы

Об этом руководстве

В этом учебном руководстве мы спроектируем и разработаем приложение обработки заказов, отображающее свою функциональность в виде Web-сервисов, посредством которых различные клиенты могут размещать информацию о заказе независимым от используемой платформы способом.

Цели

После прочтения данного учебного руководства вы сможете применить концепции и полученные знания для разработки Web-сервисов в ваших приложениях, используя технологию JAX-WS.

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

Чтобы успешно освоить данное учебное руководство, вы должны понимать основы технологии Web-сервисов и иметь некоторый опыт программирования на языке Java.

Системные требования

Чтобы выполнять примеры данного руководства, вам необходимо установить Java Platform, Standard Edition (Java SE) 6.0.


Введение в JAX-WS

Почему JAX-WS?

JAX-WS - это технология, разработанная для упрощения создания Web-сервисов и клиентов Web-сервисов на языке Java. Она предоставляет полный стек Web-сервисов, облегчающий разработку и развертывание Web-сервисов. JAX-WS поддерживает WS-I Basic Profile 1.1. Это гарантирует, что Web-сервисы, разработанные с использованием стека JAX-WS, могут потребляться любыми клиентами, разработанными на любом языке программирования и удовлетворяющими стандарту WS-I Basic Profile. JAX-WS также включает в себя JAXB (Java Architecture for XML Binding) и SAAJ (SOAP with Attachments API for Java).

JAXB реализует возможности связывания данных, предоставляя удобный способ отобразить XML-схему на представление в Java-коде. JAXB скрывает преобразование сообщений XML-схемы в SOAP-сообщенияя от Java-кода, избавляя разработчика от необходимости глубокого понимания XML и SOAP-анализа. Спецификация JAXB определяет связывание между Java и XML-схемами. SAAJ обеспечивает стандартный способ работы с XML-вложениями, находящимися в SOAP-сообщении.

Более того, JAX-WS ускоряет разработку Web-сервисов, предоставляя библиотеку аннотаций для преобразования POJO-классов (plain old Java object – традиционные Java-объекты) в Web-сервисы. Она также определяет детализированное отображение сервисов, определенных на языке WSDL (Web Services Description Language), в Java-классы, реализующие эти сервисы. Все сложные типы, определенные в WSDL, отображаются в Java-классы согласно отображению, определенному спецификацией JAXB. JAX-WS ранее поставлялась с платформой Java Platform, Enterprise Edition (Java EE) 5. Спецификация JAX-WS 2.0 разрабатывается под эгидой JSR 224 Java Community Process (JCP).


Разработка Web-сервиса

Подход первичности контракта по сравнению с подходом первичности кода

Хорошим способом знакомства с JAX-WS является разработка Web-сервиса. Web-сервис можно разработать двумя способами:

  • Первичность контракта. Начинаем с WSDL-контракта и генерируем Java-класс для реализации сервиса.
  • Первичность кода. Начинаем с Java-класса и с помощью аннотаций генерируем WSDL-файл и Java-интерфейс.

Подход с первичностью WSDL требует хорошего понимания WSDL и XSD (XML Schema Definition) для определения форматов сообщений. Если вы являетесь новичком в Web-сервисах, сначала лучше придерживаться принципа первичности кода. Этот подход и будет использоваться в данном учебном руководстве при разработке Web-сервисов.

Разработка Web-сервисов исходя из кода

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

Разработка Web-сервиса обработки заказов

Давайте начнем с создания Web-сервиса обработки заказов, принимающего информацию о заказе, месте доставки, заказываемых позициях и, в конечном итоге, генерирующего в качестве ответа идентификатор подтверждения (confirmation ID). Код этого сервиса представлен в листинге 1. Это макетная реализация, выводящая идентификатор клиента и количество заказываемых позиций на консоль, а затем возвращающая фиктивный идентификатор заказа A1234. (Исходный код полного приложения можно загрузить, используя ссылки, приведенные в разделе "Загрузка" данного руководства.) Извлеките исходный код на диск C в папку JAXWS-Tutorial. Эта папка содержит исходный код, показанный в листинге 1.

Листинг 1. Реализация Web-сервиса обработки заказов
package com.ibm.jaxws.tutorial.service;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import com.ibm.jaxws.tutorial.service.bean.OrderBean;


//JWS-аннотация, указывающая, что имя portType Web-сервиса 
//равно "OrderProcessPort", имя сервиса равно 
//"OrderProcess", а targetNamespace, использующийся в сгенерированном 
//WSDL, равен "http://jawxs.ibm.tutorial/jaxws/orderprocess".

@WebService(serviceName = "OrderProcess",
		portName = "OrderProcessPort",	
		targetNamespace = "http://jawxs.ibm.tutorial/jaxws/orderprocess")
	
//JWS-аннотация, определяющая отображение сервиса на 
//протокол SOAP-сообщений. В частности, она определяет, что SOAP-сообщения 
//являются литералами документа.

@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=SOAPBinding.Use.LITERAL,
        parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)

public class OrderProcessService {

	@WebMethod
	public OrderBean processOrder(OrderBean orderBean) {

		// Выполнить обработку...
		System.out.println("processOrder called for customer"
				+ orderBean.getCustomer().getCustomerId());

		// Заказанными позициями являются
		if (orderBean.getOrderItems() != null) {
			System.out.println("Number of items is "
					+ orderBean.getOrderItems().length);
		}

		//Обработать заказ.

		//Установить идентификатор заказа.
		orderBean.setOrderId("A1234");

		return orderBean;
	}
}

OrderBean хранит информацию о заказе, как показано в листинге 2. В частности, он содержит ссылки на клиента, заказанные позиции и объект адреса доставки.

Листинг 2. Класс OrderBean, хранящий информацию о заказе
package com.ibm.jaxws.tutorial.service.bean;

public class OrderBean {

	private Customer customer;

	private Address shippingAddress;

	private OrderItem[] orderItems;

	private String orderId;

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

	public String getOrderId() {
		return orderId;
	}

	public void setOrderId(String orderId) {
		this.orderId = orderId;
	}

	public Address getShippingAddress() {
		return shippingAddress;
	}

	public void setShippingAddress(Address shippingAddress) {
		this.shippingAddress = shippingAddress;
	}

	public OrderItem[] getOrderItems() {
		return orderItems;
	}

	public void setOrderItems(OrderItem[] orderItems) {
		this.orderItems = orderItems;
	}

}

Отправным пунктом разработки JAX-WS Web-сервиса является Java-класс, аннотируемый при помощи аннотации javax.jws.WebService. Используемые аннотации JAX-WS являются частью метаданных Web Services Metadata для спецификации Java Platform (JSR-181). Как вы, вероятно, заметили, OrderProcessService аннотируется при помощи аннотации WebService, которая определяет класс как оконечную точку Web-сервиса.

Класс OrderProcessService (это класс с аннотацией @javax.jws.WebService) неявно определяет интерфейс оконечной точки (service endpoint interface - SEI), объявляющий методы, которые клиент может активизировать в сервисе. Все public-методы, определенные в классе (если они не аннотированы аннотацией @WebMethod с элементом exclude, установленным в true), отображаются на WSDL-операции. Аннотация @WebMethod является необязательной и используется для настройки работы Web-сервиса. Помимо элемента exclude, аннотация javax.jws.WebMethod предоставляет название операции и элементы action, которые используются для настройки атрибута name и элемента SOAP action в WSDL-документе. Эти свойства не обязательны; если они не определены, из имени класса наследуются значения по умолчанию.

После реализации Web-сервиса необходимо сгенерировать все артефакты, требующиеся для развертывания сервиса, а затем спакетировать Web-сервис в развертываемый артефакт (обычно в WAR-файл) и развернуть WAR-файл на любом совместимом сервере, поддерживающем спецификацию JAX-WS 2.0. Обычно сгенерированные артефакты являются классами, обеспечивающими преобразование Java-объектов в XML, а WSDL-файл и XSD-схема основываются на интерфейсе сервиса.

Для тестирования в Java 6 включен облегченный Web-сервер, на котором можно публиковать Web-сервис путем активизации простого вызова API. Далее мы рассмотрим, как протестировать Web-сервисы, используя данный подход.


Публикация сервиса

Генерирование JAX-WS-артефактов

Переносимые JAX-WS-артефакты для Web-сервиса обработки заказов генерируются при помощи программы wsgen. Эта программа считывает класс Web SEI и генерирует все необходимые артефакты для развертывания и активизации Web-сервиса. Программа wsgen генерирует WSDL-файл и XSD-схему для Web-сервиса, который нужно опубликовать.

Для генерирования JAX-WS-артефактов прежде всего необходимо скомпилировать исходные файлы bean-компонентов и сервиса:

  1. Откройте командную строку и перейдите в каталог c:\JAXWS-Tutorial.
  2. Выполните следующую команду для компилирования Java-файлов и поместите файлы классов в соответствующие папки:

    javac com\ibm\jaxws\tutorial\service\*.java com\ibm\jaxws\tutorial\service\bean\*.java
  3. Выполните следующую команду для генерирования JAX-WS-артефактов:

    wsgen -cp . com.ibm.jaxws.tutorial.service.OrderProcessService -wsdl

Программа wsgen имеет много возможностей, в частности, генерирование артефактов WSDL и схемы для сервиса при указании параметра -wsdl. После выполнения этой команды вы должны увидеть файлы OrderProcess.wsdl и OrderProcess_schema1.xsd, сгенерированные в папке JAXWS-Tutorial, и JAX-WS-артефакты, созданные в папке com\ibm\jaxws\tutorial\service\jaxws.

После генерирования артефактов Web-сервис обработки заказов публикуется путем выполнения следующего клиентского приложения-публикатора:

  1. Скомпилируйте OrderWebServicePublisher, выполнив следующую команду из папки c:\JAXWS-Tutorial:

    javac com\ibm\jaxws\tutorial\service\publish\OrderWebServicePublisher.java
  2. Затем выполните команду:

    java com.ibm.jaxws.tutorial.service.publish.OrderWebServicePublisher

После выполнения Java-программы вы должны увидеть следующее сообщение: The Web service is published at http://localhost:8080/OrderProcessWeb/orderprocess (Web-сервис опубликован по адресу http://localhost:8080/OrderProcessWeb/orderprocess). Для остановки работающего Web-сервиса завершите этот Java-процесс.

Web-сервис обработки заказов публикуется по адресу http://localhost:8080/OrderProcessWeb/orderprocess. Проверить работу Web-сервиса можно путем отображения WSDL, сгенерированного Web-сервисом обработки заказов:

  1. Откройте браузер и перейдите по адресу http://localhost:8080/OrderProcessWeb/orderprocess?wsdl.

Анализируем OrderWebServicePublisher

Перед анализом артефактов WSDL и схемы давайте проанализируем код OrderWebServicePublisher. В листинге 3 приведен исходный код клиента OrderWebServicePublisher.

Листинг 3. Код для публикации Web-сервиса обработки заказов
package com.ibm.jaxws.tutorial.service.publish;

import javax.xml.ws.Endpoint;

import com.ibm.jaxws.tutorial.service.OrderProcessService;

public class OrderWebServicePublisher {

	public static void main(String[] args) {

		Endpoint.publish("http://localhost:8080/OrderProcessWeb/orderprocess",
				new OrderProcessService());

	}

}

Метод Endpoint.publish() обеспечивает удобный способ публикации и тестирования JAX-WS Web-сервиса. Метод publish() принимает два параметра: местоположение Web-сервиса и класс реализации JAX-WS Web-сервиса. Методы publish() создают облегченный Web-сервер по указанному адресу URL (в данном случае это хост localhost и порт 8080) и развертывают Web-сервис по этому месторасположению. Облегченный Web-сервер выполняется в виртуальной Java-машине (Java virtual machine - JVM) и может быть завершен путем вызова метода endpoint.stop() по условию или путем завершения клиента OrderWebServicePublisher.

Анализ сгенерированного WSDL

Для просмотра сгенерированного WSDL Web-сервиса обработки заказов, введите в браузер следующий URL: http://localhost:8080/OrderProcessWeb/orderprocess?wsdl.

Давайте проанализируем некоторые важные аспекты WSDL и посмотрим, как были сгенерированы артефакты WSDL и схема на основе метаданных JAX-WS, начиная с анализа сгенерированного XSD. Он импортируется в WSDL-файл при помощи тегов xsd:import (см. листинг 4); schemaLocation указывает месторасположение XSD.

Листинг 4. WSDL-файл, содержащий определение схемы обработки заказов
<types>
	
    <xsd:schema>
      <xsd:import namespace="http://jawxs.ibm.tutorial/jaxws/orderprocess" 
	  schemaLocation="OrderProcess_schema1.xsd"/>
    </xsd:schema>
</types>

Поместите schemaLocation (http://localhost:8080/OrderProcessWeb/orderprocess?xsd=1) в браузер, чтобы просмотреть определения схемы в браузере. Давайте проанализируем, что здесь происходит. Определение схемы начинается с targetNamspace и объявления tns, отображающегося на пространство имен targetNamespace, http://jawxs.ibm.tutorial/jaxws/orderprocess, которое вы определили в аннотации @WebService для OrderProcessService. В листинге 5 приведен этот код.

Листинг 5. Объявление пространства имен схемы
<xs:schema version="1.0" 
    targetNamespace="http://jawxs.ibm.tutorial/jaxws/orderprocess"
    xmlns:tns="http://jawxs.ibm.tutorial/jaxws/orderprocess" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

Программа wsgen, выполненная ранее, генерирует два инкапсулирующих bean-класса, ProcessOrder и ProcessOrderResponse, которые хранят входные и выходные сообщения для Web-сервиса обработки заказов. На основе этих bean-классов генерируются следующие элементы схемы:

  • processOrder является типом processOrder, который представляет сложный тип, содержащий один элемент с названием arg0 и типом orderBean. Между классом ProcessOrder и сложным типом processOrder существует однозначное отображение.
  • processOrderResponse аналогичен типу processOrderResponse, определения которого отображаются на класс ProcessOrderResponse.

Давайте более детально рассмотрим листинг 6.

Листинг 6. Объявление схемы для processOrder
<xs:element name="processOrder" type="tns:processOrder"/>
  <xs:element name="processOrderResponse" type="tns:processOrderResponse"/>
  <xs:complexType name="processOrder">
    <xs:sequence>
      <xs:element name="arg0" type="tns:orderBean" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

Определение типа orderBean, приведенное в листинге 7, отображается на класс OrderBean. Определение типа orderBean состоит из:

  • Элемента customer, типом которого является customer.
  • ordered, типом которого является string.
  • orderItems (который является массивом, поскольку атрибут maxOccurs определен как unbounded), типом которого является orderItem.
  • shippingAddress, типом которого является address.
Листинг 7. Объявление схемы для processOrder
<xs:complexType name="orderBean">
<xs:sequence>
<xs:element name="customer" type="tns:customer" minOccurs="0" /> 
          <xs:element name="orderId" type="xs:string" minOccurs="0" /> 
          <xs:element nillable="true" maxOccurs="unbounded" name="orderItems" 
                          type="tns:orderItem" minOccurs="0" /> 
          <xs:element name="shippingAddress" type="tns:address"   
                         minOccurs="0" /> 
</xs:sequence>
</xs:complexType

Аналогичным образом оставшиеся определения схемы для элементов customer, orderItems и address отображаются на Java bean-компоненты Customer, OrderItem и Address соответственно.

После анализа определений схемы давайте снова обратимся к определениям сообщений в WSDL, которые приведены в листинге 8. WSDL определяет сообщения processOrder и processOrderResponse, частичными элементами которого являются processOrder и processOrderResponse (вы уже сталкивались с определениями их схемы). portType определяет операцию processOrder, входящим сообщением которой является processOrder, а исходящим - processOrderResponse.

Листинг 8. Элемент сообщения processOrder в WSDL-документе
  <message name="processOrder">
  		<part element="tns:processOrder" name="parameters" /> 
  </message>
  <message name="processOrderResponse">
  		<part element="tns:processOrderResponse" name="parameters" /> 
  </message>
  <portType name="OrderProcessService">
  <operation name="processOrder">
  <input message="tns:processOrder" /> 
  <output message="tns:processOrderResponse" /> 
  </operation>
  </portType>

Далее определяется WSDL-привязка. Она определяет стиль soap:binding как документ и тег использования soap:body как литерал для форматов входящих и исходящих сообщений для операции processOrder. Сгенерированные WSDL-определения отображаются на аннотацию @SOAPBinding, которую вы определили в классе OrderProcessService (см. листинг 9).

Листинг 9. Информация о привязке для WSDL-документа
 <binding name="OrderProcessPortBinding" type="tns:OrderProcessService">
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
 <operation name="processOrder">
  <soap:operation soapAction="" /> 
 <input>
  <soap:body use="literal" /> 
  </input>
  <output>
  <soap:body use="literal" /> 
  </output>
  </operation>
</binding>

Затем определяются WSDL-сервисы. Они указывают порт и соответствующий тип привязки вместе с реальным месторасположением сервиса. Это обычно HTTP-адрес, который в данном случае равен http://localhost:8080/OrderProcessWeb/orderprocess. Подробно это можно увидеть в листинге 10.

Листинг 10. Информация о сервисе для WSDL-документа
<service name="OrderProcess">
  <port name="OrderProcessPort" binding="tns:OrderProcessPortBinding">
  <soap:address location="http://localhost:8080/OrderProcessWeb/orderprocess" /> 
</port>

Мы проанализировали сгенерированные артефакты WSDL и схемы. В листинге 11 приведен пример SOAP-сообщения запроса, передаваемого клиентом Web-сервиса, когда он активизирует операцию processOrder.

Листинг 11. Пример SOAP-сообщения для операции processOrder
<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns1=" http://jawxs.ibm.tutorial/jaxws/orderprocess" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soapenv:Body>
<ns1:processOrder>
<arg0>
<customer><customerId>A123</customerId>
<firstName>John</firstName><lastName>Smith</lastName></customer>
<orderItems><itemId>11</itemId><qty>11</qty></orderItems>
</arg0>
</ns1:processOrder>
</soapenv:Body>
</soapenv:Envelope>

Создание клиентов Web-сервиса

Создание клиентов Web-сервиса из WSDL

В данном разделе рассказывается, как создавать клиентов Web-сервиса из WSDL. JAX-WS поставляется с программой wsimport, которая используется для генерирования переносимых артефактов JAX-WS из WSDL. К обычно генерируемым артефактам относятся:

  • SEI
  • Сервис (класс реализации сервиса, который нужно реализовать)
  • JAXB-сгенерированные классы из типов схемы
  • Класс расширения, отображенный из wsdl:fault (если есть)

Клиенты используют артефакты, сгенерированные для активизации Web-сервиса. Клиенты Web-сервиса не обязаны обрабатывать SOAP-формат самостоятельно, например, создавая или анализируя SOAP-сообщения. Это делает во время исполнения система JAX-WS, используя сгенерированный код артефактов (сгенерированный JAXB класс). Клиент Web-сервиса, в свою очередь, имеет дело с Java-объектом (сгенерированный JAXB класс), который облегчает разработку клиентов Web-сервиса и активизацию операций в Web-сервисах.

Артефакты JAX-WS генерируются из OrderProcess WSDL при помощи программы wsimport. Затем создается клиент Web-сервиса, который использует сгенерированный код артефакта для активизации Web-сервиса обработки заказов. Для генерирования артефактов JAX-WS перейдите в каталог JAXWS-Tutorial и выполните команду wsimport, приведенную в листинге 12. Перед этим убедитесь, что Web-сервис был опубликован путем выполнения OrderWebServicePublisher, как указано на шаге 5 в разделе "Генерирование артефактов JAX-WS".

Листинг 12. Команда wsimport для генерирования артефактов JAX-WS, используемых клиентом Web-сервиса
wsimport -keep -p com.ibm.jaxws.tutorial.service.client 
	http://localhost:8080/OrderProcessWeb/orderprocess?wsdl

Параметр -keep указывает, что сгенерированные файлы сохраняются, а параметр -p указывает название пакета, в который должны генерироваться артефакты. http://localhost:8080/OrderProcessWeb/orderprocess?wsdl указывает месторасположение WSDL-файла. Из WSDL OrderProcessService генерируются следующие артефакты:

  • JAXB-классы (Address, Customer, OrderBean и OrderItem). Генерируются при чтении определений схемы, указанных в WSDL OrderProcessService.
  • Классы RequestWrapper и ResponseWrapper (ProcessOrder и ProcessOrderResponse). Инкапсулируют входные и выходные данные для стиля литеральной инкапсуляции документа.
  • Класс сервиса (OrderProcess). Класс, который используют ваши клиенты для выполнения запросов к Web-сервису.
  • Интерфейс сервиса (OrderProcessService). Класс содержит интерфейс, который реализует ваш сервис.

Теперь посмотрим, как создать клиент Web-сервиса, используя артефакты, сгенерированные выше. Пример кода содержится в папке com\ibm\jaxws\tutorial\service\client. Код клиента Web-сервиса приведен в листинге 13.

Листинг 13. Листинг кода клиента Web-сервиса обработки заказов
package com.ibm.jaxws.tutorial.service.client;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;

public class OrderClient {

	final QName qName = new QName(
			"http://jawxs.ibm.tutorial/jaxws/orderprocess", "OrderProcess");

	public static void main(String[] args) {
		if (args.length != 1) {
			System.out
			    .println("Specify the URL of the OrderProcess Web Service");
			System.exit(-1);
		}
		URL url = getWSDLURL(args[0]);
		OrderClient client = new OrderClient();
		client.processOrder(url);
	}

	private static URL getWSDLURL(String urlStr) {
		URL url = null;
		try {
			url = new URL(urlStr);
		} catch (MalformedURLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return url;
	}

	public void processOrder(URL url) {

		OrderProcess orderProcessingService = new OrderProcess(url, qName);

		System.out.println("Service is" + orderProcessingService);

		OrderBean order = populateOrder();

		OrderProcessService port = orderProcessingService.getOrderProcessPort();
		OrderBean orderResponse = port.processOrder(order);

		System.out.println("Order id is " + orderResponse.getOrderId());

	}

	private OrderBean populateOrder() {

		OrderBean order = new OrderBean();
		Customer customer = new Customer();
		customer.setCustomerId("A123");
		customer.setFirstName("John");
		customer.setLastName("Smith");
		order.setCustomer(customer);

		// Заполнение Order Item.
		OrderItem item = new OrderItem();
		item.setItemId("11");
		item.setQty(11);

		order.getOrderItems().add(item);
		return order;
	}
}

Приведенный выше код клиента Web-сервиса:

  • Создает экземпляр класса OrderProcess, передавая в WSDL URL-адрес Web-сервиса OrderProcess вместе с QName сервиса.
  • Создает экземпляр OrderBean и заполняет метод populateOrder() информацией о заказе.
  • Извлекает прокси к сервису, называемый также портом, активизируя метод getOrderProcessPort() сервиса. Порт реализует интерфейс сервиса, определяемый сервисом.
  • Активизирует метод processOrder порта, передавая экземпляр OrderBean, созданный во втором пункте вышеприведенного списка.
  • Получает ответ OrderBean из сервиса и выводит идентификатор заказа.

Выполнение клиента Web-сервиса

Для выполнения клиента Web-сервиса прежде всего скомпилируйте его, выполнив следующую команду из папки JAXWS-Tutorial:

javac com\ibm\jaxws\tutorial\service\client\OrderClient.java

Выполните клиент Web-сервиса, указав URL WSDL для Web-сервиса обработки заказов и введя следующую команду:

java com.ibm.jaxws.tutorial.service.client.OrderClient http://localhost:8080/OrderProcessWeb/orderprocess?wsdl

При выполнении клиента Web-сервиса вы увидите следующие выходные данные в консоли, в которой выполняется OrderWebServicePublisher:

processOrder called for customer A123
Number of items is 1

В консоли, в которой выполняется клиент Web-сервиса, выводится следующая информация:

Order id is A1234

Как видно из кода клиента, при активизации операций Web-сервиса вы не имеете дела с каким-либо SOAP- или XML-форматом; вместо этого вы работаете со сгенерированными JAXB-классами для входных и выходных сообщений и используете интерфейс сервиса и объекты класса сервиса, выступающие в роли заглушек для активизации Web-сервиса. Заглушки отвечают за создание SOAP-запросов из аннотаций JAXB и за преобразование SOAP-ответа обратно в Java-объект.

Вы успешно создали и опубликовали ваш Web-сервис и выполнили его посредством клиента Web-сервиса!


Резюме

Из данного учебного руководства вы узнали, как спроектировать и разработать Web-сервисы, используя подход первенства кода и технологию JAX-WS. JAX-WS - это отличный выбор, поскольку она предоставляет полный стек Web-сервисов для упрощения разработки и развертывания Web-сервисов.

Разработанный вами в данном руководстве Web-сервис обработки заказов использует Web-сервис документного стиля, что гарантирует взаимодействие потребителя и провайдера посредством XML-документов. XML-документы твердо придерживаются четко определенных контрактов, обычно задаваемых при помощи определений XML Schema. Формат XML Schema определяет контракт о бизнес-сообщениях, которые могут запрашивать потребители сервиса, и придерживается его. Web-сервисам документного стиля следует отдавать предпочтение при разработке корпоративных Web-сервисов.


Загрузка

ОписаниеИмяРазмер
Код JAX-WS Web-сервисовjaxws.zip32 КБ

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=SOA и web-сервисы, Технология Java
ArticleID=458019
ArticleTitle=Проектирование и разработка Web-сервисов JAX-WS 2.0
publish-date=12212009