Статьи

Веб-сервисы с Mule, CXF и Spring

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

Эта статья призвана стать кратким руководством по настройке и запуску веб-службы с использованием сочетания службы на основе пружин (POJO) с CXF и Mule Enterprise Service Bus.

Начиная

Чтобы запустить код, связанный с этой статьей, вам необходимо скачать последнюю версию Mule с:
http://mule.mulesource.org/display/MULE/Download .

На данный момент последняя стабильная версия сообщества — 2.01. Следуйте инструкциям на сайте, чтобы установить Mule.

Код

Для этого примера мы собираемся создать службу каталога товаров, где пользователи могут получить список продуктов, которые мы продаем, а также информацию о конкретных продуктах. Мы собираемся использовать подход «сначала код» для этого сервиса с использованием аннотаций JAX-WS.

Во-первых, нам нужно создать несколько классов:
1) интерфейс для нашего сервиса
2) класс реализации для нашего сервиса
3) наш продукт bean

Интерфейс

Код для интерфейса показан ниже. Обратите внимание на аннотации, которые используются. Аннотация @WebService используется для обозначения того, что это веб-служба (довольно понятная), @WebResult используется для указания того, что наш вывод будет заключен в тег с заданным именем, а @WebParam используется для присвоения имени наш входной параметр, который делает вещи более удобочитаемыми для клиентов SOAP. Остальная часть кода — это просто наш стандартный интерфейс Java.

package example.catalog;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

import java.util.Collection;
import java.util.List;

@WebService
public interface ProductCatalogService {

@WebResult(name="item")
public List<String> listProducts();

@WebResult(name="product")
public Product getProductDetail(@WebParam(name="productId") String productId);

}

Реализация

Класс реализации — это просто обычный класс Java, который реализует наш интерфейс и использует единственную аннотацию @WebService. Используя эту аннотацию, вы можете указать имя и интерфейс конечной точки, которые будут использоваться для службы.

package example.catalog;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@WebService(endpointInterface = "example.catalog.ProductCatalogService",
serviceName = "ProductCatalogService")
public class ProductCatalogServiceImpl implements ProductCatalogService {
Map<String, Product> productMap = new HashMap<String, Product>();

public ProductCatalogServiceImpl() {
// Load some products
Product product = new Product("SW123", "Square Widget", 10, 10);
productMap.put(product.getId(), product);
product = new Product("RW456", "Round Widget", 5, 5);
productMap.put(product.getId(), product);
}

public List<String> listProducts() {
List<String> productListing = new ArrayList<String>();

Collection<Product> products = productMap.values();
for (Product p : products) {
productListing.add(p.getId() + " - " + p.getDescription());
}

return productListing;
}

public Product getProductDetail(String productId) {
Product product = null;
product = productMap.get(productId);
return product;
}

}

Бин продукта

Бин Product — это просто стандартный Java-бин, который должен следовать стандартным соглашениям, чтобы все работало правильно. Он должен реализовывать интерфейс Serializable, должен иметь конструктор по умолчанию и должен иметь оба метода получения и установки. Этот bean-компонент будет автоматически преобразован в XML с использованием JAXB и будет возвращен в ответе SOAP.

package example.catalog;

import java.io.Serializable;

public class Product implements Serializable {
private String id;
private String description;
private int width;
private int height;

public Product() {
}

public Product(String id, String description, int width, int height) {
this.id = id;
this.description = description;
this.width = width;
this.height = height;
}

public String getId() {
return id;
}

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

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}

public int getWidth() {
return width;
}

public void setWidth(int width) {
this.width = width;
}

}

конфигурация

Чтобы наш сервис работал под Mule, нам нужно создать два файла конфигурации:
1) конфигурационный файл Spring;
2) конфигурационный файл Mule.

Конфигурационный файл Spring

Файл конфигурации для Spring показан ниже. Мы объявляем наш компонент реализации сервиса, который будет загружен контейнером Spring. Мы сохраним это в файле catalogContext.xml.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean id="productCatalogService"
class="example.catalog.ProductCatalogServiceImpl"
scope="singleton">
</bean>

</beans>

 

Конфигурационный файл Mule

Используя конфигурацию, показанную ниже, мы сначала сообщаем Mule имя нашего конфигурационного файла Spring. Интеграция Mule с Spring отличная.

Далее мы настраиваем наш сервис. Мы объявляем, что входящая конечная точка использует CXF, и мы определяем URL для адреса службы. Мы также заявляем, что наш Spring-Загруженный компонент является компонентом, который будет обрабатывать запросы для этой службы.

Мы сохраним это в файле catalogservice-config.xml.

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:soap="http://www.mulesource.org/schema/mule/soap/2.0"
xmlns:cxf="http://www.mulesource.org/schema/mule/cxf/2.0"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.mulesource.org/schema/mule/core/2.0 http://www.mulesource.org/schema/mule/core/2.0/mule.xsd
http://www.mulesource.org/schema/mule/soap/2.0 http://www.mulesource.org/schema/mule/soap/2.0/mule-soap.xsd
http://www.mulesource.org/schema/mule/cxf/2.0 http://www.mulesource.org/schema/mule/cxf/2.0/mule-cxf.xsd">

<spring:beans>
<spring:import resource="catalogContext.xml"/>
</spring:beans>

<model name="services">
<service name="ProductCatalogService">
<inbound>
<cxf:inbound-endpoint address="http://localhost:65082/services/ProductCatalogService" />
</inbound>
<component>
<spring-object bean="productCatalogService" />
</component>
</service>
</model>

</mule>

 

Сборка и развертывание

Теперь, когда у нас есть созданные классы и файлы конфигурации, следующий шаг — скомпилировать классы и упаковать их в файл jar. Этот jar-файл будет затем развернут в каталоге lib / user вашей установки Mule (т.е. MULE_HOME / lib / user).

Запуск сервиса

Чтобы запустить службу в Mule, вам потребуется выполнить следующее из командной строки или сценария:
В Windows: MULE_HOME / bin / mule.bat -config <путь-к-файлу-конфигурации> \ catalogservice-config.xml
В Unix: MULE_HOME / bin / mule start -config <path-to-config-file> \ catalogservice-config.xml

Чтобы убедиться, что служба работает, откройте веб-браузер и перейдите по следующему URL-адресу:
http: // localhost: 65082 / services / ProductCatalogService? wsdl

Вы должны увидеть файл WSDL, созданный для нашего сервиса.

Тестирование сервиса с SoapUI

Как только Mule будет запущен со службой, вы можете легко протестировать ее с помощью бесплатного инструмента для тестирования веб-служб с открытым исходным кодом, soapUI. Его можно скачать по адресу:
http://www.soapui.org/.

После запуска soapUI вы можете создать новый проект, выбрав «Новый проект WSDL» в меню «Файл». Вы получите следующий диалог, в котором вы можете ввести Имя проекта и Начальный URL WSDL.

Как только проект создан, разверните дерево, и вы должны увидеть что-то вроде этого:

 

Отсюда вы можете дважды щелкнуть элемент «Запрос 1» в списке «Продукты», чтобы открыть Редактор запросов для этой операции. Далее просто нажмите на зеленую стрелку, чтобы вызвать сервис. Вы должны увидеть результаты, как показано ниже:

Вы можете сделать вызов операции getProductDetail аналогичным образом. После того, как вы откроете Редактор запросов для этой операции, просто замените знак вопроса в теге <productId> на действительный идентификатор продукта, такой как SW123. Затем нажмите зеленую стрелку, чтобы выполнить вызов, и вы должны получить ответ SOAP, содержащий атрибуты Product в формате XML.

Заворачивать

С помощью фреймворков Mule, CXF и Spring вы можете быстро запустить и запустить веб-сервисы. Эти фреймворки дают вам большую гибкость и предлагают гораздо больше функциональности, чем было описано здесь. Но, надеюсь, это даст хорошую отправную точку для дальнейших исследований.