Stvaranje web usluge SOAP s Springom

1. Pregled

U ovom uputstvu vidjet ćemo kako stvoriti Web usluga temeljena na SOAP-u s web uslugama Spring Boot Starter.

2. SOAP web usluge

Web usluga je ukratko usluga od stroja do stroja, neovisna o platformi koja omogućuje komunikaciju putem mreže.

SOAP je protokol za razmjenu poruka. Poruke (zahtjevi i odgovori) jesu XML dokumenti preko HTTP-a. XML ugovor definiran je WSDL-om (Jezik opisa web usluga). Pruža skup pravila za definiranje poruka, veza, operacija i lokacije usluge.

XML koji se koristi u SOAP-u može postati izuzetno složen. Iz tog razloga, najbolje je koristiti SOAP s okvirom poput JAX-WS ili Spring, kao što ćemo vidjeti u ovom vodiču.

3. Ugovor-prvi razvojni stil

Postoje dva moguća pristupa prilikom izrade web usluge: Ugovor-zadnji i Ugovor-prvi. Kada koristimo posljednji ugovor, započinjemo s Java kodom i iz klasa generiramo ugovor o web usluzi (WSDL). Kada koristite ugovor prvo, započinjemo s WSDL ugovorom iz kojeg generiramo Java klase.

Spring-WS podržava samo ugovorni prvi razvojni stil.

4. Postavljanje projekta Spring Boot

Stvorit ćemo projekt Spring Boot gdje ćemo definirati naš SOAP WS poslužitelj.

4.1. Ovisnosti Mavena

Krenimo dodavanjem proljeće-čizma-starter-roditelj našem projektu:

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

Dalje, dodajmo spring-boot-starter-web-usluge i wsdl4j ovisnosti:

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

4.2. XSD datoteka

Pristup prema ugovoru zahtijeva da prvo stvorimo domenu (metode i parametre) za našu uslugu. Koristit ćemo datoteku XML sheme (XSD) koju će Spring-WS automatski izvesti kao WSDL:

U ovoj datoteci vidimo format datoteke getCountryRequest zahtjev za web uslugu. Definiramo ga tako da prihvaća jedan parametar tipa niz.

Dalje, definiramo format odgovora koji sadrži objekt tipa zemlja.

Napokon vidimo valuta objekt koji se koristi u zemlja objekt.

4.3. Generirajte klase Java domene

Sada ćemo generirati Java klase iz XSD datoteke definirane u prethodnom odjeljku. The jaxb2-maven-dodatak učinit će to automatski za vrijeme gradnje. Dodatak koristi alat XJC kao mehanizam za generiranje koda. XJC kompajlira datoteku sheme XSD u potpuno označene Java klase.

Dodajmo i konfigurirajmo dodatak u našem pom.xml:

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

Ovdje primjećujemo dvije važne konfiguracije:

  • $ {project.basedir} / src / main / resources - Mjesto XSD datoteke
  • $ {project.basedir} / src / main / java - Tamo gdje želimo da se generira naš Java kôd

Da bismo generirali Java klase, jednostavno bismo mogli koristiti alat xjc iz naše Java instalacije. Iako su u našem projektu Maven stvari još jednostavnije, kao što je klase će se automatski generirati tijekom uobičajene gradnje Mavena:

mvn sastaviti

4.4. Dodajte krajnju točku SOAP web usluge

Klasa krajnje točke web-usluge SOAP obrađivat će sve dolazne zahtjeve za uslugom. Inicirat će obradu i odgovor će poslati natrag.

Prije nego što to definiramo, kreiramo Zemlja spremište radi pružanja podataka web usluzi.

@Component javna klasa CountryRepository {privatni statički konačni Zemljovid zemlje = novi HashMap (); @PostConstruct javna void initData () {// inicijaliziraj kartu zemalja} public Country findCountry (naziv niza) {return countries.get (name); }} 

Dalje, konfigurirajmo krajnju točku:

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

Evo nekoliko detalja koje treba primijetiti:

  • @Endpoint - registrira razred s Spring WS kao krajnju točku web usluge
  • @PayloadRootdefinira metodu rukovatelja prema prostor imena i localPart atributi
  • @ResponsePayload - označava da ova metoda vraća vrijednost koja se preslikava na korisni teret odgovora
  • @RequestPayload - označava da ova metoda prihvaća parametar koji se preslikava iz dolaznog zahtjeva

4.5. Grah za konfiguraciju web usluge SOAP

Stvorimo sada klasu za konfiguriranje proljetnog servleta dispečera poruka za primanje zahtjeva:

@EnableWs @Configuration javna klasa WebServiceConfig proširuje WsConfigurerAdapter {// definicije graha}

@EnableWs omogućuje značajke SOAP web usluge u ovom programu Spring Boot. The WebServiceConfig razred proširuje WsConfigurerAdapter osnovna klasa, koja konfigurira anonimni model Spring-WS programskog modela.

Stvorimo a MessageDispatcherServlet koji se koristi za obradu SOAP zahtjeva:

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

Postavili smo ubrizgano ApplicationContext objekt servlet tako da Spring-WS može pronaći i drugi proljetni grah.

Omogućujemo i WSDL transformaciju servleta lokacije. Ovo transformira atribut lokacije za sapun: adresa u WSDL-u tako da odražava URL dolaznog zahtjeva.

Napokon, kreirajmo a Zadana definicijaWsdl11 objekt. Ovo izlaže standardni WSDL 1.1 koristeći XsdSchemu. WSDL ime bit će isto kao i naziv graha.

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

5. Testiranje projekta SOAP

Kada se konfiguracija projekta dovrši, spremni smo ga testirati.

5.1. Izgradite i pokrenite projekt

Bilo bi moguće stvoriti WAR datoteku i rasporediti je na vanjski aplikacijski poslužitelj. Umjesto toga upotrijebit ćemo Spring Boot, što je brži i jednostavniji način za pokretanje aplikacije.

Prvo dodamo sljedeću klasu kako bismo aplikaciju učinili izvršnom:

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

Primijetite da za izradu ove aplikacije ne koristimo nijednu XML datoteku (poput web.xml). Sve je to čista Java.

Sada smo spremni za izgradnju i pokretanje aplikacije:

mvn spring-boot: trčanje

Da bismo provjerili radi li aplikacija ispravno, možemo otvoriti WSDL putem URL-a: //localhost:8080/ws/countries.wsdl

5.2. Testirajte SOAP zahtjev

Da bismo testirali zahtjev, kreiramo sljedeću datoteku i imenujemo je request.xml:

    Španjolska 

Da bismo zahtjev poslali našem testnom poslužitelju, mogli bismo upotrijebiti vanjske alate poput SoapUI-a ili proširivača Google Chrome Wizdler. Drugi način je pokretanje sljedeće naredbe u našoj ljusci:

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

Rezultirajući odgovor možda neće biti lako pročitati bez uvlačenja ili prijeloma linija.

Da bismo je vidjeli formatiranu, možemo je kopirati i zalijepiti u naš IDE ili neki drugi alat. Ako smo instalirali xmllib2, možemo poslati izlaz naše naredbe curl u xmllint:

curl [opcije naredbenog retka] | xmllint --format -

Odgovor bi trebao sadržavati informacije o Španjolskoj:

     Španjolska 46704314 Madrid EUR 

6. Zaključak

U ovom smo članku naučili kako stvoriti SOAP web uslugu pomoću Spring Boot-a. Također smo naučili kako generirati Java kôd iz XSD datoteke i vidjeli kako konfigurirati Spring grah potreban za obradu SOAP zahtjeva.

Kompletni izvorni kod dostupan je na GitHubu.