Рубрики
Без рубрики

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

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

Автор оригинала: Sampada Wagde.

1. Обзор

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

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

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

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

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

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

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

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

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

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

3. Клиент

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

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

3.1. Создание Клиентского кода

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

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

 
    org.jvnet.jaxb2.maven2
    maven-jaxb2-plugin
    0.14.0
    
         
              
                  generate
              
         
    
    
          WSDL
          ${project.basedir}/src/main/java
          com.baeldung.springsoap.client.gen
          ${project.basedir}/src/main/resources
          
             countries.wsdl
          
    

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

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

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

mvn compile

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

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

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

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

3.2. Страна

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

Мы назовем этот класс Клиент страны :

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 . Другими словами, вот где мы провели обмен мылом .

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

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

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

3.3. Страна ClientConfig

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

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

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

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

Пожалуйста, также обратите внимание на URI по умолчанию для клиента здесь. Он задается как soap:адрес местоположение, указанное в 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());
    }
}

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

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

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

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

Мы просто поцарапали поверхность того, что Spring может предложить в области веб-сервисов SOAP; есть много возможностей для изучения .

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