Membuat Layanan Web SOAP dengan Spring

1. Ikhtisar

Dalam tutorial ini, kita akan melihat cara membuat layanan web berbasis SOAP dengan Layanan Web Pemula Boot Musim Semi.

2. Layanan Web SOAP

Singkatnya, layanan web adalah layanan mandiri platform mesin-ke-mesin yang memungkinkan komunikasi melalui jaringan.

SOAP adalah protokol perpesanan. Pesan (permintaan dan tanggapan) adalah dokumen XML melalui HTTP . Kontrak XML ditentukan oleh WSDL (Bahasa Deskripsi Layanan Web). Ini menyediakan seperangkat aturan untuk menentukan pesan, binding, operasi, dan lokasi layanan.

XML yang digunakan dalam SOAP bisa menjadi sangat kompleks. Untuk alasan ini, yang terbaik adalah menggunakan SOAP dengan kerangka kerja seperti JAX-WS atau Spring, seperti yang akan kita lihat di tutorial ini.

3. Gaya Pengembangan Kontrak-Pertama

Ada dua kemungkinan pendekatan saat membuat layanan web: Kontrak-Terakhir dan Kontrak-Pertama. Saat kami menggunakan pendekatan kontrak terakhir, kami mulai dengan kode Java, dan kami membuat kontrak layanan web (WSDL) dari kelas. Saat menggunakan contract-first, kita mulai dengan kontrak WSDL, tempat kita menghasilkan class Java.

Spring-WS hanya mendukung gaya pengembangan yang mengutamakan kontrak.

4. Menyiapkan Proyek Spring Boot

Kami akan membuat proyek Spring Boot di mana kami akan menentukan server SOAP WS kami.

4.1. Dependensi Maven

Mari kita mulai dengan menambahkan spring-boot-starter-parent ke proyek kita:

 org.springframework.boot spring-boot-starter-parent 2.2.6.RELEASE  

Selanjutnya, mari tambahkan dependensi spring-boot-starter-web-services dan wsdl4j :

 org.springframework.boot spring-boot-starter-web-services   wsdl4j wsdl4j  

4.2. File XSD

Pendekatan kontrak pertama mengharuskan kami membuat domain (metode dan parameter) untuk layanan kami terlebih dahulu. Kami akan menggunakan file skema XML (XSD) yang akan diekspor Spring-WS secara otomatis sebagai WSDL:

Dalam file ini, kita melihat format permintaan layanan web getCountryRequest . Kami mendefinisikannya untuk menerima satu parameter dari tipe string .

Selanjutnya, kami menentukan format respons, yang berisi objek dari negara tipe .

Akhirnya, kami melihat objek mata uang , digunakan di dalam objek negara .

4.3. Hasilkan Kelas Java Domain

Kami sekarang akan menghasilkan kelas Java dari file XSD yang ditentukan di bagian sebelumnya. The jaxb2-maven-plugin akan melakukan ini secara otomatis selama waktu membangun. Plugin ini menggunakan alat XJC sebagai mesin pembuat kode. XJC mengompilasi file skema XSD menjadi kelas Java yang dianotasi sepenuhnya.

Mari tambahkan dan konfigurasikan plugin di pom.xml kami:

 org.codehaus.mojo jaxb2-maven-plugin 1.6   xjc  xjc     ${project.basedir}/src/main/resources/ ${project.basedir}/src/main/java false   

Di sini kami melihat dua konfigurasi penting:

  • $ {project.basedir} / src / main / resources - Lokasi file XSD
  • $ {project.basedir} / src / main / java - Di mana kita ingin kode Java kita dihasilkan

Untuk menghasilkan kelas Java, kita cukup menggunakan alat xjc dari instalasi Java kita. Meskipun dalam proyek Maven kami, segala sesuatunya menjadi lebih sederhana, karena kelas akan secara otomatis dibuat selama pembuatan Maven biasa:

mvn compile

4.4. Tambahkan SOAP Web Service Endpoint

Kelas titik akhir layanan web SOAP akan menangani semua permintaan masuk untuk layanan tersebut. Ini akan memulai pemrosesan dan akan mengirim tanggapan kembali.

Sebelum menentukan ini, kami membuat repositori Negara untuk menyediakan data ke layanan web.

@Component public class CountryRepository { private static final Map countries = new HashMap(); @PostConstruct public void initData() { // initialize countries map } public Country findCountry(String name) { return countries.get(name); } } 

Selanjutnya, mari konfigurasikan titik akhir:

@Endpoint public class CountryEndpoint { private static final String NAMESPACE_URI = "//www.baeldung.com/springsoap/gen"; private CountryRepository countryRepository; @Autowired public CountryEndpoint(CountryRepository countryRepository) { this.countryRepository = countryRepository; } @PayloadRoot(namespace = NAMESPACE_URI, localPart = "getCountryRequest") @ResponsePayload public GetCountryResponse getCountry(@RequestPayload GetCountryRequest request) { GetCountryResponse response = new GetCountryResponse(); response.setCountry(countryRepository.findCountry(request.getName())); return response; } } 

Berikut beberapa detail yang perlu diperhatikan:

  • @ Titik Akhir - mendaftarkan kelas dengan Spring WS sebagai Titik Akhir Layanan Web
  • @PayloadRoot - mendefinisikan metode handler sesuai dengan namespace dan atribut localPart
  • @ResponsePayload - menunjukkan bahwa metode ini mengembalikan nilai yang akan dipetakan ke payload respons
  • @RequestPayload - menunjukkan bahwa metode ini menerima parameter yang akan dipetakan dari permintaan masuk

4.5. Kacang Konfigurasi Layanan Web SOAP

Sekarang mari buat kelas untuk mengkonfigurasi servlet dispatcher pesan Spring untuk menerima permintaan:

@EnableWs @Configuration public class WebServiceConfig extends WsConfigurerAdapter { // bean definitions }

@EnableWs mengaktifkan fitur SOAP Web Service di aplikasi Spring Boot ini. Kelas WebServiceConfig memperluas kelas dasar WsConfigurerAdapter , yang mengonfigurasi model pemrograman Spring-WS berdasarkan anotasi.

Let's create a MessageDispatcherServlet which is used for handling SOAP requests:

@Bean public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) { MessageDispatcherServlet servlet = new MessageDispatcherServlet(); servlet.setApplicationContext(applicationContext); servlet.setTransformWsdlLocations(true); return new ServletRegistrationBean(servlet, "/ws/*"); } 

We set the injected ApplicationContext object of the servlet so that Spring-WS can find other Spring beans.

We also enable the WSDL location servlet transformation. This transforms the location attribute of soap:address in the WSDL so that it reflects the URL of the incoming request.

Finally, let's create a DefaultWsdl11Definition object. This exposes a standard WSDL 1.1 using an XsdSchema. The WSDL name will be the same as the bean name.

@Bean(name = "countries") public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) { DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition(); wsdl11Definition.setPortTypeName("CountriesPort"); wsdl11Definition.setLocationUri("/ws"); wsdl11Definition.setTargetNamespace("//www.baeldung.com/springsoap/gen"); wsdl11Definition.setSchema(countriesSchema); return wsdl11Definition; } @Bean public XsdSchema countriesSchema() { return new SimpleXsdSchema(new ClassPathResource("countries.xsd")); } 

5. Testing the SOAP Project

Once the project configuration has been completed, we're ready to test it.

5.1. Build and Run the Project

It would be possible to create a WAR file and deploy it to an external application server. We'll instead use Spring Boot, which is a faster and easier way to get the application up and running.

First, we add the following class to make the application executable:

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

Notice that we're not using any XML files (like web.xml) to create this application. It's all pure Java.

Now we're ready to build and run the application:

mvn spring-boot:run

To check if the application is running properly, we can open the WSDL through the URL: //localhost:8080/ws/countries.wsdl

5.2. Test a SOAP Request

To test a request, we create the following file and name it request.xml:

    Spain    

To send the request to our test server, we could use external tools like SoapUI or the Google Chrome extension Wizdler. Another way is to run the following command in our shell:

curl --header "content-type: text/xml" -d @request.xml //localhost:8080/ws

Respons yang dihasilkan mungkin tidak mudah dibaca tanpa indentasi atau jeda baris.

Untuk melihatnya diformat, kita dapat menyalin dan menempelkannya ke IDE kita atau alat lain. Jika kami telah menginstal xmllib2, kami dapat menyalurkan output dari perintah curl kami ke xmllint :

curl [command-line-options] | xmllint --format -

Tanggapan tersebut harus berisi informasi tentang Spanyol:

     Spain 46704314 Madrid EUR     

6. Kesimpulan

Pada artikel ini, kami mempelajari cara membuat layanan web SOAP menggunakan Spring Boot. Kami juga belajar bagaimana membuat kode Java dari file XSD, dan kami melihat bagaimana mengkonfigurasi Spring beans yang diperlukan untuk memproses permintaan SOAP.

Kode sumber lengkap tersedia di GitHub.