Перейти к основному содержимому

Вызов веб-службы SOAP в Spring

· 4 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

Ранее мы видели, как создать веб-службу SOAP с помощью Spring .

В этом руководстве мы узнаем, как создать клиент на основе Spring для использования этой веб-службы .

При вызове веб-службы SOAP в Java мы сделали то же самое, используя JAX-WS RI.

2. Веб-сервис Spring SOAP — краткий обзор

Ранее в Spring мы создали веб-службу для получения данных о стране по ее названию. Прежде чем углубляться в реализацию клиента, давайте кратко повторим, как мы это сделали.

Следуя подходу «сначала контракт», мы сначала написали файл схемы XML, определяющий домен. Затем мы использовали этот XSD для создания классов для модели запроса, ответа и данных с помощью jaxb2-maven-plugin .

После этого мы закодировали четыре класса:

  • CountryEndpoint — конечная точка, отвечающая на запрос.
  • CountryRepository — репозиторий на сервере для предоставления данных о стране.
  • WebServiceConfig — конфигурация, определяющая необходимые bean-компоненты
  • Приложение — приложение Spring Boot, чтобы сделать наш сервис доступным для использования.

Наконец, мы протестировали его через cURL, отправив запрос SOAP.

Теперь давайте запустим сервер, запустив указанное выше загрузочное приложение, и перейдем к следующему шагу.

3. Клиент

Здесь мы собираемся создать клиент Spring для вызова и тестирования вышеуказанного веб-сервиса .

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

3.1. Сгенерировать код клиента

Во-первых, мы создадим несколько классов, используя WSDL, доступный по адресу http://localhost:8080/ws/countries.wsdl . Мы загрузим и сохраним это в нашей папке src/main/resources .

Чтобы сгенерировать код с помощью Maven, мы добавим maven-jaxb2-plugin в наш pom.xml :

<plugin> 
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaLanguage>WSDL</schemaLanguage>
<generateDirectory>${project.basedir}/src/main/java</generateDirectory>
<generatePackage>com.foreach.springsoap.client.gen</generatePackage>
<schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory>
<schemaIncludes>
<include>countries.wsdl</include>
</schemaIncludes>
</configuration>
</plugin>

Примечательно, что в конфигурации плагина мы определили:

  • generateDirectory — папка, в которой будут сохраняться сгенерированные артефакты
  • generatePackage — имя пакета, которое будут использовать артефакты.
  • schemaDirectory и schemaIncludes — каталог и имя файла для WSDL.

Чтобы выполнить процесс генерации JAXB, мы запустим этот плагин, просто создав проект:

mvn compile

Интересно, что сгенерированные здесь артефакты такие же, как и для сервиса.

Давайте перечислим те, которые мы будем использовать:

  • Country.java и Currency.java — объекты POJO, представляющие модель данных.
  • GetCountryRequest.java — тип запроса
  • GetCountryResponse.java — тип ответа

Службу можно было развернуть в любой точке мира, и с помощью всего лишь ее WSDL мы смогли сгенерировать те же классы на стороне клиента, что и на сервере!

3.2. СтранаКлиент

Далее нам нужно расширить Spring WebServiceGatewaySupport для взаимодействия с веб-службой.

Мы назовем этот класс CountryClient :

public class CountryClient extends WebServiceGatewaySupport {

public GetCountryResponse getCountry(String country) {
GetCountryRequest request = new GetCountryRequest();
request.setName(country);

GetCountryResponse response = (GetCountryResponse) getWebServiceTemplate()
.marshalSendAndReceive(request);
return response;
}
}

Здесь мы определили единственный метод getCountry , соответствующий операции, предоставленной веб-службой. В методе мы создали экземпляр GetCountryRequest и вызвали веб-службу для получения GetCountryResponse . Другими словами, здесь мы выполнили SOAP-обмен .

Как мы видим, Spring сделал вызов довольно простым с помощью WebServiceTemplate . Мы использовали метод шаблона marshalSendAndReceive для выполнения обмена SOAP.

Преобразования XML обрабатываются здесь через подключаемый модуль Marshaller.

Теперь давайте посмотрим на конфигурацию , из которой исходит этот Marshaller .

3.3. CountryClientConfig

Все, что нам нужно для настройки нашего клиента Spring WS, — это два bean-компонента.

Во-первых, Jaxb2Marshaller для преобразования сообщений в XML и из XML, а во-вторых, наш CountryClient , который будет подключен к компоненту marshaller :

@Configuration
public class CountryClientConfig {

@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.foreach.springsoap.client.gen");
return marshaller;
}
@Bean
public CountryClient countryClient(Jaxb2Marshaller marshaller) {
CountryClient client = new CountryClient();
client.setDefaultUri("http://localhost:8080/ws");
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
return client;
}
}

Здесь нам нужно позаботиться о том, чтобы контекстный путь маршаллера был таким же, как и generatePackage , указанный в конфигурации плагина нашего pom.xml .

Также обратите внимание на URI по умолчанию для клиента здесь. Он задается как расположение soap:address, указанное в WSDL.

4. Тестирование клиента

Затем мы напишем тест JUnit, чтобы убедиться, что наш клиент работает должным образом:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CountryClientConfig.class, loader = AnnotationConfigContextLoader.class)
public class ClientLiveTest {

@Autowired
CountryClient client;

@Test
public void givenCountryService_whenCountryPoland_thenCapitalIsWarsaw() {
GetCountryResponse response = client.getCountry("Poland");
assertEquals("Warsaw", response.getCountry().getCapital());
}

@Test
public void givenCountryService_whenCountrySpain_thenCurrencyEUR() {
GetCountryResponse response = client.getCountry("Spain");
assertEquals(Currency.EUR, response.getCountry().getCurrency());
}
}

Как мы видим, мы подключили bean-компонент CountryClient , определенный в нашем CountryClientConfig . Затем мы использовали его getCountry для вызова удаленной службы, как описано ранее.

Более того, мы смогли извлечь информацию, необходимую для наших утверждений, используя сгенерированные модели данных POJO, Country и Currency .

5. Вывод

В этом руководстве мы рассмотрели основы того, как вызывать веб-службу SOAP с помощью Spring WS .

Мы лишь коснулись того, что Spring может предложить в области веб-сервисов SOAP; есть много, чтобы исследовать .

Как всегда, исходный код доступен на GitHub .