Memanggil Layanan Web SOAP di Spring

1. Ikhtisar

Sebelumnya, kami melihat cara membuat layanan web SOAP dengan Spring.

Dalam tutorial ini, kita akan belajar cara membuat klien berbasis Spring untuk menggunakan layanan web ini .

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

2. Layanan Web Spring SOAP - Rekap Singkat

Sebelumnya, kami telah membuat layanan web di Spring untuk mengambil data suatu negara, berdasarkan namanya. Sebelum mempelajari implementasi klien, mari lakukan rekap cepat tentang cara kami melakukannya.

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

Setelah itu kami memberi kode empat kelas:

  • CountryEndpoint - titik akhir yang membalas permintaan
  • CountryRepository - repositori di backend untuk memasok data negara
  • WebServiceConfig - konfigurasi yang menentukan kacang yang diperlukan
  • Aplikasi - Aplikasi Spring Boot untuk membuat layanan kami tersedia untuk konsumsi

Akhirnya, kami mengujinya melalui cURL dengan mengirimkan permintaan SOAP.

Sekarang mari kita mulai server dengan menjalankan aplikasi Boot di atas dan melanjutkan ke langkah berikutnya.

3. Klien

Di sini, kami akan membuat klien Spring untuk memanggil dan menguji layanan web di atas .

Sekarang, mari kita lihat langkah demi langkah apa yang perlu kita lakukan untuk membuat klien.

3.1. Hasilkan Kode Klien

Pertama, kami akan membuat beberapa kelas menggunakan WSDL yang tersedia di //localhost:8080/ws/countries.wsdl. Kami akan mengunduh dan menyimpannya di folder src / main / resources kami .

Untuk menghasilkan kode menggunakan Maven, kami akan menambahkan maven-jaxb2-plugin 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   

Khususnya, dalam konfigurasi plugin yang kami tentukan:

  • generateDirectory - folder tempat artefak yang dihasilkan akan disimpan
  • generatePackage - nama paket yang akan digunakan artefak
  • schemaDirectory dan schemaIncludes - direktori dan nama file untuk WSDL

Untuk menjalankan proses pembuatan JAXB, kami akan menjalankan plugin ini hanya dengan membangun proyek:

mvn compile

Menariknya, artefak yang dibuat di sini sama dengan yang dibuat untuk layanan tersebut.

Mari daftar yang akan kita gunakan:

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

Layanan ini dapat digunakan di mana saja di dunia, dan hanya dengan WSDL-nya, kami dapat membuat kelas yang sama di sisi klien sebagai server!

3.2. CountryClient

Selanjutnya, kita perlu memperluas Dukungan WebServiceGateway Spring untuk berinteraksi dengan layanan web.

Kami akan menyebut 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 mendefinisikan satu metode getCountry , sesuai dengan operasi yang telah diekspos oleh layanan web. Dalam metode ini, kami membuat turunan GetCountryRequest dan memanggil layanan web untuk mendapatkan GetCountryResponse . Dengan kata lain, di sinilah kami melakukan pertukaran SOAP .

Seperti yang bisa kita lihat, Spring membuat pemanggilan cukup mudah dengan WebServiceTemplate -nya . Kami menggunakan metode template marshalSendAndReceive untuk melakukan pertukaran SOAP.

Konversi XML ditangani di sini melalui Marshaller yang terpasang .

Sekarang mari kita lihat konfigurasi dari mana Marshaller ini berasal.

3.3. CountryClientConfig

Yang kita butuhkan untuk mengkonfigurasi klien Spring WS adalah dua kacang.

Pertama, Jaxb2Marshaller untuk mengonversi pesan ke dan dari XML, dan kedua, CountryClient kami , yang akan mengirim 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 bahwa jalur konteks marshaller sama dengan generatePackage yang ditentukan dalam konfigurasi plugin pom.xml kita .

Harap perhatikan juga URI default untuk klien di sini. Ini ditetapkan sebagai sabun: lokasi alamat yang ditentukan dalam WSDL.

4. Menguji Klien

Selanjutnya, kami akan menulis pengujian JUnit untuk memverifikasi bahwa klien 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 bisa kita lihat, kita menghubungkan kacang CountryClient yang didefinisikan di CountryClientConfig kita . Kemudian, kami menggunakan getCountry untuk memanggil layanan jarak jauh seperti yang dijelaskan sebelumnya.

Selain itu, kami dapat mengekstrak informasi yang kami butuhkan untuk pernyataan kami menggunakan model data POJO, Negara, dan Mata Uang yang dihasilkan .

5. Kesimpulan

Dalam tutorial ini, kami melihat dasar-dasar cara memanggil layanan web SOAP menggunakan Spring WS .

Kami hanya menggores permukaan dari apa yang ditawarkan Spring di area layanan web SOAP; ada banyak hal untuk dijelajahi.

Seperti biasa, kode sumber tersedia di GitHub.