Извикване на SOAP уеб услуга през пролетта

1. Общ преглед

Преди това видяхме как да създадем SOAP уеб услуга с Spring.

В този урок ще научим как да създадем клиент, базиран на Spring, който да използва тази уеб услуга .

При извикването на SOAP уеб услуга в Java направихме същото, използвайки JAX-WS RI.

2. Пролетната SOAP уеб услуга - бързо обобщение

По-рано бяхме създали уеб услуга през пролетта, за да извлечем данни за дадена държава, като получихме нейното име. Преди да се задълбочим в внедряването на клиента, нека направим кратко обобщение на това как го направихме.

Следвайки първоначалния подход, първо написахме файл с XML схема, дефиниращ домейна. След това използвахме този XSD, за да генерираме класове за заявката, отговора и модела на данни, използвайки приставката jaxb2-maven-plugin .

След това кодирахме четири класа:

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

Накрая го тествахме чрез cURL, като изпратихме SOAP заявка.

Сега нека стартираме сървъра, като стартираме горното приложение за стартиране и преминем към следващата стъпка.

3. Клиентът

Тук ще изградим Spring клиент, който да извика и тества горната уеб услуга .

Сега нека видим стъпка по стъпка какво трябва да направим, за да създадем клиент.

3.1. Генериране на клиентски код

Първо, ще генерираме няколко класа, използвайки WSDL, достъпен на //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   

По-специално, в конфигурацията на приставката дефинирахме:

  • genereDirectory - папката, в която ще бъдат запазени генерираните артефакти
  • generiPackage - името на пакета, което ще използват артефактите
  • schemaDirectory и schemaIncludes - името на директорията и файла за WSDL

За да извършим процеса на генериране на JAXB, ще изпълним този плъгин, като просто изградим проекта:

mvn compile

Интересното е, че артефактите, генерирани тук, са същите като тези, генерирани за услугата.

Нека изброим тези, които ще използваме:

  • Country.java и Currency.java - POJO, представляващи модела на данни
  • GetCountryRequest.java - типът на заявката
  • GetCountryResponse.java - типът отговор

Услугата може да бъде внедрена навсякъде по света и само със своя WSDL успяхме да генерираме същите класове в края на клиента като сървъра!

3.2. CountryClient

След това трябва да разширим WebServiceGatewaySupport на Spring, за да взаимодействаме с уеб услугата.

Ще наречем този клас 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.

Сега нека разгледаме конфигурацията, откъдето идва този Маршалер .

3.3. CountryClientConfig

Всичко, от което се нуждаем, за да конфигурираме нашия Spring WS клиент, са два боб.

Първо, Jaxb2Marshaller да конвертирате съобщения до и от XML, и второ, нашата CountryClient , който ще изпратя в marshaller боб:

@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("//localhost:8080/ws"); client.setMarshaller(marshaller); client.setUnmarshaller(marshaller); return client; } } 

Ето, ние трябва да се грижи, че marshaller е контекст път е същото като generatePackage посочено в конфигурацията на плъгин на нашата pom.xml .

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

Както виждаме, свързвахме кабела в боб CountryClient, дефиниран в нашия CountryClientConfig . След това използвахме неговия getCountry, за да извикаме отдалечената услуга, както е описано по-рано.

Освен това успяхме да извлечем информацията, от която се нуждаехме за нашите твърдения, използвайки генерирания модел на данни POJO, държава и валута .

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

В този урок видяхме основите на това как да извикваме SOAP уеб услуга, използвайки Spring WS .

Ние просто надраскахме повърхността на това, което Spring може да предложи в областта на уеб услугите SOAP; има много за изследване.

Както винаги, изходният код е достъпен в GitHub.