Memohon Perkhidmatan Web SOAP pada musim bunga

1. Gambaran keseluruhan

Sebelum ini, kami melihat bagaimana membuat perkhidmatan web SOAP dengan Spring.

Dalam tutorial ini, kita akan belajar bagaimana membuat klien berasaskan Spring untuk menggunakan perkhidmatan web ini .

Dalam menggunakan perkhidmatan web SOAP di Java, kami melakukan hal yang sama menggunakan JAX-WS RI.

2. Perkhidmatan Web Spring SOAP - Ringkasan Cepat

Sebelumnya, kami telah membuat perkhidmatan web pada musim bunga untuk mengambil data negara, dengan namanya. Sebelum menyelidiki pelaksanaan klien, mari kita buat ringkasan ringkas bagaimana kita melakukannya.

Mengikuti pendekatan kontrak pertama, kami pertama kali menulis fail skema XML yang menentukan domain. Kami kemudian menggunakan XSD ini untuk menghasilkan kelas untuk permintaan, respons, dan model data menggunakan plugin jaxb2-maven .

Selepas itu kami mengodkan empat kelas:

  • CountryEndpoint - titik akhir yang membalas permintaan tersebut
  • CountryRepository - repositori di bahagian belakang untuk membekalkan data negara
  • WebServiceConfig - konfigurasi yang menentukan kacang yang diperlukan
  • Aplikasi - Aplikasi Spring Boot untuk menyediakan perkhidmatan kami untuk dimakan

Akhirnya, kami mengujinya melalui cURL dengan menghantar permintaan SOAP.

Sekarang mari mulakan pelayan dengan menjalankan aplikasi Boot di atas dan beralih ke langkah seterusnya.

3. Pelanggan

Di sini, kami akan membina klien Spring untuk menggunakan dan menguji perkhidmatan web di atas .

Sekarang, mari kita lihat langkah demi langkah apa yang perlu kita lakukan untuk mewujudkan pelanggan.

3.1. Hasilkan Kod Pelanggan

Pertama, kami akan menjana beberapa kelas menggunakan WSDL yang terdapat di //localhost:8080/ws/countries.wsdl. Kami akan memuat turun dan menyimpannya di folder src / main / resources kami .

Untuk menghasilkan kod menggunakan Maven, kami akan menambahkan plugin maven-jaxb2 ke pom.xml kami :

 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   

Terutama, dalam konfigurasi pemalam yang kami tentukan:

  • createDirectory - folder di mana artifak yang dihasilkan akan disimpan
  • createPackage - nama pakej yang akan digunakan artifak
  • schemaDirectory dan schemaIncludes - direktori dan nama fail untuk WSDL

Untuk menjalankan proses penjanaan JAXB, kami akan melaksanakan pemalam ini dengan hanya membina projek:

mvn compile

Menariknya, artifak yang dihasilkan di sini sama dengan artifak yang dihasilkan untuk perkhidmatan ini.

Mari senaraikan yang akan kita gunakan:

  • Country.java dan Currency.java - POJO yang mewakili model data
  • GetCountryRequest.java - jenis permintaan
  • GetCountryResponse.java - jenis tindak balas

Perkhidmatan ini mungkin digunakan di mana sahaja di dunia, dan hanya dengan WSDLnya, kami dapat menjana kelas yang sama di hujung pelanggan dengan pelayan!

3.2. Pelanggan Negara

Seterusnya, kita perlu memperluas Spring WebServiceGatewaySupport untuk berinteraksi dengan perkhidmatan web.

Kami akan memanggil kelas ini 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; } }

Di sini, kami menentukan satu kaedah getCountry , yang sesuai dengan operasi yang telah didedahkan oleh perkhidmatan web. Dalam kaedah tersebut, kami membuat instance GetCountryRequest dan meminta perkhidmatan web untuk mendapatkan GetCountryResponse . Dengan kata lain, di sinilah kami melakukan pertukaran SOAP .

Seperti yang kita lihat, Spring membuat permohonan dengan mudah dengan WebServiceTemplate . Kami menggunakan kaedah templat marshalSendAndReceive untuk melakukan pertukaran SOAP.

Penukaran XML dikendalikan di sini melalui Marshaller yang dipasang .

Sekarang mari kita lihat konfigurasi dari mana Marshaller ini berasal.

3.3. CountryClientConfig

Apa yang kita perlukan untuk mengkonfigurasi klien Spring WS kami adalah dua biji.

Pertama, Jaxb2Marshaller untuk menukar mesej ke dan dari XML, dan kedua, CountryClient kami , yang akan dimasukkan ke dalam kacang 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; } } 

Di sini, kita perlu berhati-hati bahawa jalan konteks marshaller adalah sama dengan menghasilkanPackage yang ditentukan dalam konfigurasi plugin pom.xml kami .

Perhatikan juga URI lalai untuk pelanggan di sini. Ini ditetapkan sebagai sabun: lokasi alamat yang ditentukan dalam WSDL.

4. Menguji Pelanggan

Seterusnya, kami akan menulis ujian JUnit untuk mengesahkan bahawa pelanggan kami berfungsi seperti yang diharapkan:

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

Seperti yang kita lihat, kita memasang kabel di CountryClient bean yang ditentukan dalam CountryClientConfig kami . Kemudian, kami menggunakan getCountry untuk memanggil perkhidmatan jarak jauh seperti yang dijelaskan sebelumnya.

Lebih-lebih lagi, kami dapat mengekstrak maklumat yang kami perlukan untuk penegasan kami menggunakan model data yang dihasilkan POJO, Country, dan Currency .

5. Kesimpulan

Dalam tutorial ini, kami melihat asas-asas bagaimana menggunakan perkhidmatan web SOAP menggunakan Spring WS .

Kami hanya mencakar permukaan apa yang ditawarkan Spring di kawasan perkhidmatan web SOAP; ada banyak yang boleh diterokai.

Seperti biasa, kod sumber tersedia di GitHub.