«1. Обзор

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

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

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

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

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

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

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

    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 в наш 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.baeldung.springsoap.client.gen</generatePackage>
          <schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory>
          <schemaIncludes>
             <include>countries.wsdl</include>
          </schemaIncludes>
    </configuration>
</plugin>

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

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

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

mvn compile

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

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

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

3.2. CountryClient

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

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

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

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;
    }
}

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

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

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

3.3. CountryClientConfig

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

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

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

@Configuration
public class CountryClientConfig {

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("com.baeldung.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;
    }
}

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

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

«

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

@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());
    }
}

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

5. Заключение

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

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

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

«