SOAP webszolgáltatás létrehozása tavasszal

1. Áttekintés

Ebben az oktatóanyagban megtudhatjuk, hogyan hozhat létre a SOAP-alapú webszolgáltatás a Spring Boot Starter webszolgáltatásokkal.

2. SOAP webszolgáltatások

A webszolgáltatás röviden egy gép-gép közötti, platformtól független szolgáltatás, amely lehetővé teszi a hálózaton keresztüli kommunikációt.

A SOAP egy üzenetküldési protokoll. Az üzenetek (kérések és válaszok) XML-dokumentumok HTTP-n keresztül. Az XML szerződést a WSDL határozza meg (Web Services Description Language). Szabályokat tartalmaz, amelyek meghatározzák az üzeneteket, összerendeléseket, műveleteket és a szolgáltatás helyét.

A SOAP-ban használt XML rendkívül összetetté válhat. Ezért a legjobb, ha a SOAP-ot olyan keretrendszerrel használja, mint a JAX-WS vagy a Spring, amint ezt az oktatóanyagban láthatjuk.

3. A szerződés első fejlesztési stílusa

A webszolgáltatás létrehozásakor kétféle megközelítés lehetséges: a Contract-Last és a Contract-First. Amikor a szerződés-utolsó megközelítést alkalmazzuk, akkor a Java kóddal indulunk, és az osztályokból generáljuk a webszolgáltatási szerződést (WSDL). A szerződés-első használatakor a WSDL szerződéssel indulunk, amelyből a Java osztályokat generáljuk.

A Spring-WS csak a szerződés első fejlesztési stílusát támogatja.

4. A tavaszi rendszerindító projekt beállítása

Létrehozunk egy Spring Boot projektet, ahol meghatározzuk a SOAP WS szerverünket.

4.1. Maven-függőségek

Kezdjük azzal, hogy hozzáadjuk a tavasz-bakancs-induló-szülő projektünkhöz:

 org.springframework.boot spring-boot-starter-parent 2.2.6.KÖZLEMÉNY 

Ezután tegyük hozzá a tavasz-boot-starter-web-szolgáltatások és wsdl4j függőségek:

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

4.2. Az XSD fájl

A szerződés-első megközelítés megköveteli, hogy először hozzuk létre a domainünket (módszereket és paramétereket) a szolgáltatásunkhoz. XML sémafájlt (XSD) fogunk használni, amelyet a Spring-WS automatikusan exportál WSDL-ként:

Ebben a fájlban látjuk a getCountryRequest webszolgáltatási kérelem. Meghatározzuk, hogy elfogadja a típus egy paraméterét húr.

Ezután meghatározzuk a válasz formátumát, amely egy típusú objektumot tartalmaz ország.

Végre látjuk a valuta objektum, amelyet a ország tárgy.

4.3. Generálja a tartomány Java osztályokat

Most létrehozzuk a Java osztályokat az előző szakaszban meghatározott XSD fájlból. A jaxb2-maven-plugin ezt automatikusan elkészíti a készítés ideje alatt. A beépülő modul az XJC eszközt használja kódgeneráló motorként. Az XJC az XSD séma fájlt teljesen kommentált Java osztályokba fordítja.

Adjuk hozzá és konfiguráljuk a bővítményt a pom.xml fájlban:

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

Itt két fontos konfigurációt észlelünk:

  • $ {project.basedir} / src / main / resources - Az XSD fájl helye
  • $ {project.basedir} / src / main / java - Ahol azt akarjuk, hogy a Java kódunkat generálják

A Java osztályok előállításához egyszerűen használhatjuk a Java telepítésünkből származó xjc eszközt. Bár a Maven projektünkben a dolgok még egyszerűbbek, mint az osztályok automatikusan generálódnak a szokásos Maven-összeállítás során:

mvn össze

4.4. Adja hozzá a SOAP webszolgáltatás végpontot

A SOAP webszolgáltatás végpont osztály kezeli a szolgáltatás összes beérkező kérését. Megkezdi a feldolgozást és visszaküldi a választ.

Ennek meghatározása előtt létrehozzuk a Ország adattárnak a webszolgáltatás számára történő adatszolgáltatása érdekében.

@Component public class CountryRepository {private static final Map countries = new HashMap (); @PostConstruct public void initData () {// inicializálja az országok térképét} public Country findCountry (String name) {return countries.get (name); }} 

Ezután konfiguráljuk a végpontot:

@Endpoint public class CountryEndpoint {private static final String NAMESPACE_URI = "//www.baeldung.com/springsoap/gen"; privát CountryRepository countryRepository; @Autowired public CountryEndpoint (CountryRepository countryRepository) {this.countryRepository = countryRepository; } @PayloadRoot (névtér = NAMESPACE_URI, localPart = "getCountryRequest") @ResponsePayload public GetCountryResponse getCountry (@RequestPayload GetCountryRequest kérés) {GetCountryResponse válasz = új GetCountryResponse (); response.setCountry (countryRepository.findCountry (request.getName ())); visszatérési válasz; }} 

Íme néhány részlet, amelyet észre kell venni:

  • @Endpoint - regisztrálja az osztályt a Spring WS szolgáltatással, mint webszolgáltatás végpontot
  • @PayloadRootszerint határozza meg a kezelő módszert névtér és localPart attribútumokat
  • @ResponsePayload - azt jelzi, hogy ez a módszer egy értéket ad vissza a válasz hasznos terheléséhez
  • @RequestPayload - azt jelzi, hogy ez a módszer elfogad egy paramétert, amelyet leképeznek a bejövő kérésből

4.5. A SOAP webszolgáltatás konfigurációs komponensei

Most hozzunk létre egy osztályt a Spring üzenet diszpécser kiszolgáló konfigurálásához a kérés fogadására:

@EnableWs @Configuration nyilvános osztály A WebServiceConfig kiterjeszti a WsConfigurerAdapter {// babdefiníciókat}

@EnableWs engedélyezi a SOAP Web Service szolgáltatásait ebben a Spring Boot alkalmazásban. A WebServiceConfig osztály kiterjeszti a WsConfigurerAdapter alaposztály, amely az annotáció-vezérelt Spring-WS programozási modellt konfigurálja.

Hozzunk létre egy MessageDispatcherServlet amelyet a SOAP kérések kezelésére használnak:

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

Beállítottuk az injekciót ApplicationContext tárgya servlet hogy a Spring-WS találjon más tavaszi babot.

Engedélyezzük a WSDL helykiszolgáló kisalkalmazás átalakítását is. Ez átalakítja a szappan: cím úgy, hogy az tükrözze a bejövő kérés URL-jét.

Végül hozzunk létre egy DefaultWsdl11Definition tárgy. Ez egy szabványos WSDL 1.1-et tesz ki XsdSchema használatával. A WSDL név megegyezik a bab nevével.

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

5. A SOAP projekt tesztelése

Miután a projekt konfigurálása befejeződött, készen állunk a tesztelésre.

5.1. Építsd és futtasd a projektet

Lehetséges lenne WAR fájl létrehozása és külső alkalmazáskiszolgálóra történő telepítése. Ehelyett a Spring Boot programot fogjuk használni, amely gyorsabb és egyszerűbb módja az alkalmazás futtatásának.

Először a következő osztályt adjuk hozzá, hogy az alkalmazás futtatható legyen:

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

Vegye figyelembe, hogy nem használunk XML fájlokat (például web.xml) az alkalmazás létrehozásához. Ez mind tiszta Java.

Most készen állunk az alkalmazás felépítésére és futtatására:

mvn spring-boot: fut

Annak ellenőrzéséhez, hogy az alkalmazás megfelelően működik-e, megnyithatjuk a WSDL-t az URL-en keresztül: //localhost:8080/ws/countries.wsdl

5.2. Teszteljen egy SOAP kérést

A kérelem teszteléséhez létrehozzuk a következő fájlt, és elnevezzük a request.xml fájlnak:

    Spanyolország 

A kérés elküldéséhez tesztkiszolgálónknak olyan külső eszközöket használhatunk, mint a SoapUI vagy a Google Chrome kiterjesztésű Wizdler. Egy másik módszer a következő parancs futtatása a shellünkben:

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

Az eredményül kapott válasz behúzás vagy sortörés nélkül nem biztos, hogy könnyen olvasható.

A formázás megtekintéséhez átmásolhatjuk az IDE-be vagy egy másik eszközbe. Ha telepítettük az xmllib2 fájlt, akkor a curl parancs kimenetét átirányíthatjuk xmllint:

curl [parancssori opciók] | xmllint --format -

A válasznak tartalmaznia kell Spanyolországra vonatkozó információkat:

     Spanyolország 46704314 Madrid EUR 

6. Következtetés

Ebben a cikkben megtanultuk, hogyan hozhatunk létre SOAP webszolgáltatást a Spring Boot használatával. Megtanultuk azt is, hogyan lehet Java kódot létrehozni egy XSD fájlból, és láttuk, hogyan kell konfigurálni a SOAP kérések feldolgozásához szükséges Spring babot.

A teljes forráskód elérhető a GitHub oldalon.