Gọi một dịch vụ web SOAP vào mùa xuân

1. Khái quát chung

Trước đây, chúng ta đã biết cách tạo dịch vụ web SOAP với Spring.

Trong hướng dẫn này, chúng ta sẽ học cách tạo một ứng dụng khách dựa trên Spring để sử dụng dịch vụ web này .

Khi gọi một dịch vụ web SOAP bằng Java, chúng tôi cũng làm như vậy bằng cách sử dụng JAX-WS RI.

2. Dịch vụ Web Spring SOAP - Bản tóm tắt nhanh

Trước đó, chúng tôi đã tạo một dịch vụ web vào Spring để tìm nạp dữ liệu của một quốc gia, với tên của nó. Trước khi đi sâu vào triển khai ứng dụng khách, hãy tóm tắt nhanh về cách chúng tôi đã thực hiện điều đó.

Theo phương pháp đầu tiên theo hợp đồng, trước tiên chúng tôi đã viết một tệp lược đồ XML xác định miền. Sau đó, chúng tôi đã sử dụng XSD này để tạo các lớp cho mô hình yêu cầu, phản hồi và dữ liệu bằng cách sử dụng jaxb2-maven-plugin .

Sau đó, chúng tôi mã hóa bốn lớp:

  • CountryEndpoint - điểm cuối trả lời yêu cầu
  • CountryRepository - kho lưu trữ ở phần phụ trợ để cung cấp dữ liệu quốc gia
  • WebServiceConfig - cấu hình xác định các bean cần thiết
  • Ứng dụng - Ứng dụng Spring Boot để cung cấp dịch vụ của chúng tôi để tiêu dùng

Cuối cùng, chúng tôi đã kiểm tra nó qua cURL bằng cách gửi một yêu cầu SOAP.

Bây giờ chúng ta hãy khởi động máy chủ bằng cách chạy ứng dụng Boot ở trên và chuyển sang bước tiếp theo.

3. Khách hàng

Ở đây, chúng ta sẽ xây dựng một ứng dụng khách Spring để gọi và kiểm tra dịch vụ web trên .

Bây giờ, hãy xem từng bước những gì chúng ta cần làm để tạo một ứng dụng khách.

3.1. Tạo mã khách hàng

Đầu tiên, chúng tôi sẽ tạo một vài lớp bằng WSDL có sẵn tại //localhost:8080/ws/countries.wsdl. Chúng tôi sẽ tải xuống và lưu nó trong thư mục src / main / resources .

Để tạo mã bằng Maven, chúng tôi sẽ thêm maven-jaxb2-plugin vào pom.xml của chúng tôi :

 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   

Đáng chú ý, trong cấu hình plugin chúng tôi đã xác định:

  • createDirectory - thư mục nơi các tạo tác được tạo sẽ được lưu
  • createPackage - tên gói mà các tạo tác sẽ sử dụng
  • schemaDirectoryschemaIncludes - thư mục và tên tệp cho WSDL

Để thực hiện quá trình tạo JAXB, chúng tôi sẽ thực thi plugin này bằng cách đơn giản xây dựng dự án:

mvn compile

Điều thú vị là các hiện vật được tạo ra ở đây cũng giống như các hiện vật được tạo ra cho dịch vụ.

Hãy liệt kê những cái chúng ta sẽ sử dụng:

  • Country.javaCurrency.java - POJO đại diện cho mô hình dữ liệu
  • GetCountryRequest.java - loại yêu cầu
  • GetCountryResponse.java - loại phản hồi

Dịch vụ này có thể được triển khai ở bất kỳ đâu trên thế giới và chỉ với WSDL của nó, chúng tôi đã có thể tạo ra các lớp giống nhau ở đầu máy khách như máy chủ!

3.2. CountryClient

Tiếp theo, chúng ta cần mở rộng WebServiceGatewaySupport của Spring để tương tác với dịch vụ web.

Chúng tôi sẽ gọi lớp này là 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; } }

Ở đây, chúng tôi đã xác định một phương thức getCountry duy nhất , tương ứng với hoạt động mà dịch vụ web đã tiếp xúc. Trong phương pháp này, chúng tôi đã tạo một phiên bản GetCountryRequest và gọi dịch vụ web để lấy GetCountryResponse . Nói cách khác, đây là nơi chúng tôi thực hiện trao đổi SOAP .

Như chúng ta có thể thấy, Spring đã thực hiện lời gọi khá đơn giản với WebServiceTemplate của nó . Chúng tôi đã sử dụng phương thức của mẫu marshalSendAndReceive để thực hiện trao đổi SOAP.

Các chuyển đổi XML được xử lý ở đây thông qua một Marshaller được cài sẵn.

Bây giờ chúng ta hãy xem xét cấu hình mà Marshaller này đến từ đâu.

3.3. CountryClientConfig

Tất cả những gì chúng ta cần để cấu hình ứng dụng Spring WS của chúng ta là hai bean.

Đầu tiên, một Jaxb2Marshaller để chuyển đổi các thông báo sang và từ XML, và thứ hai, CountryClient của chúng tôi , sẽ chuyển sang dây trong bean 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; } } 

Ở đây, chúng ta cần phải chăm sóc mà marshaller đường dẫn ngữ cảnh 's cũng giống như generatePackage quy định trong cấu hình plugin của chúng tôi pom.xml .

Cũng xin lưu ý URI mặc định cho máy khách tại đây. Nó được đặt làm vị trí địa chỉ: xà phòng được chỉ định trong WSDL.

4. Kiểm tra Khách hàng

Tiếp theo, chúng tôi sẽ viết một bài kiểm tra JUnit để xác minh rằng ứng dụng khách của chúng tôi đang hoạt động như mong đợi:

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

Như chúng ta có thể thấy, chúng tôi đã nối dây trong bean CountryClient được xác định trong CountryClientConfig của chúng tôi . Sau đó, chúng tôi sử dụng getCountry của nó để gọi dịch vụ từ xa như đã mô tả trước đó.

Hơn nữa, chúng tôi có thể trích xuất thông tin cần thiết cho các khẳng định của mình bằng cách sử dụng mô hình dữ liệu đã tạo POJO, Quốc giaĐơn vị tiền tệ .

5. Kết luận

Trong hướng dẫn này, chúng ta đã thấy những điều cơ bản về cách gọi một dịch vụ web SOAP bằng Spring WS .

Chúng tôi chỉ mới sơ bộ về những gì Spring cung cấp trong lĩnh vực dịch vụ web SOAP; có rất nhiều thứ để khám phá.

Như mọi khi, mã nguồn có sẵn trên GitHub.