Opprette en SOAP-nettjeneste med Spring

1. Oversikt

I denne opplæringen vil vi se hvordan du lager en SOAP-basert nettjeneste med Spring Boot Starter Web Services.

2. SOAP Web Services

En nettjeneste er kort sagt en maskin-til-maskin, plattformuavhengig tjeneste som tillater kommunikasjon over et nettverk.

SOAP er en meldingsprotokoll. Meldinger (forespørsler og svar) er XML-dokumenter over HTTP. XML-kontrakten er definert av WSDL (Beskrivelsesspråk for webtjenester). Det gir et sett med regler for å definere meldinger, bindinger, operasjoner og plassering av tjenesten.

XML som brukes i SOAP kan bli ekstremt kompleks. Av denne grunn er det best å bruke SOAP med et rammeverk som JAX-WS eller Spring, som vi vil se i denne opplæringen.

3. Kontrakts-første utviklingsstil

Det er to mulige tilnærminger når du oppretter en nettjeneste: Contract-Last og Contract-First. Når vi bruker en kontrakt-siste tilnærming, starter vi med Java-koden, og vi genererer nettjenestekontrakten (WSDL) fra klassene. Når du bruker kontrakt-først, vi starter med WSDL-kontrakten, hvorfra vi genererer Java-klassene.

Spring-WS støtter bare den første utviklingsstilen for kontrakten.

4. Sette opp Spring Boot Project

Vi skal lage et Spring Boot-prosjekt der vi definerer SOAP WS-serveren vår.

4.1. Maven avhengigheter

La oss starte med å legge til spring-boot-starter-parent til prosjektet vårt:

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

La oss deretter legge til spring-boot-starter-web-services og wsdl4j avhengigheter:

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

4.2. XSD-filen

Kontrakts-første tilnærmingen krever at vi først oppretter domenet (metoder og parametere) for tjenesten vår. Vi skal bruke en XML-skjemafil (XSD) som Spring-WS vil eksportere automatisk som en WSDL:

I denne filen ser vi formatet til getCountryRequest webtjenesteforespørsel. Vi definerer det for å akseptere en parameter av typen streng.

Deretter definerer vi formatet på svaret, som inneholder et objekt av typen land.

Endelig ser vi valuta objekt, brukt i land gjenstand.

4.3. Generer Java-klasser for domener

Vi skal nå generere Java-klassene fra XSD-filen som ble definert i forrige avsnitt. De jaxb2-maven-plugin vil gjøre dette automatisk i løpet av byggetiden. Pluggen bruker XJC-verktøyet som motor for kodegenerering. XJC kompilerer XSD-skjemafilen i fullkommenterte Java-klasser.

La oss legge til og konfigurere pluginet i vår pom.xml:

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

Her merker vi to viktige konfigurasjoner:

  • $ {project.basedir} / src / main / resources - Plasseringen til XSD-filen
  • $ {project.basedir} / src / main / java - Hvor vi vil at Java-koden skal genereres til

For å generere Java-klassene, kan vi bare bruke xjc-verktøyet fra Java-installasjonen. Selv om ting i vårt Maven-prosjekt er enda enklere, som klassene genereres automatisk under den vanlige Maven-bygningen:

mvn kompilere

4.4. Legg til SOAP Web Service Endpoint

SOAP endepunktklassen for nettjeneste vil håndtere alle innkommende forespørsler om tjenesten. Det vil starte behandlingen og vil sende svaret tilbake.

Før vi definerer dette, lager vi en Land depot for å levere data til nettjenesten.

@Komponent offentlig klasse CountryRepository {privat statisk slutt Kart land = nytt HashMap (); @PostConstruct public void initData () {// initialiser landskart} public Country findCountry (String name) {return country.get (name); }} 

Deretter la oss konfigurere sluttpunktet:

@Endpoint offentlig klasse CountryEndpoint {privat statisk finale 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 offentlig GetCountryResponse getCountry (@RequestPayload GetCountryRequest-forespørsel) {GetCountryResponse respons = ny GetCountryResponse (); response.setCountry (countryRepository.findCountry (request.getName ())); returrespons; }} 

Her er noen få detaljer å merke:

  • @Endpoint - registrerer klassen med Spring WS som Endpoint for Web Service
  • @PayloadRootdefinerer behandlermetoden i henhold til navneområdet og lokal del attributter
  • @ResponsePayload - indikerer at denne metoden returnerer en verdi som skal tilordnes til svarets nyttelast
  • @RequestPayload - indikerer at denne metoden godtar en parameter som skal tilordnes fra den innkommende forespørselen

4.5. SOAP Web Service Configuration Beans

La oss nå opprette en klasse for konfigurering av vårmeldingsutleveringsservlet for å motta forespørselen:

@EnableWs @Configuration offentlig klasse WebServiceConfig utvider WsConfigurerAdapter {// bean definitions}

@EnableWs aktiverer SOAP Web Service-funksjoner i dette Spring Boot-programmet. De WebServiceConfig klasse utvider WsConfigurerAdapter baseklasse, som konfigurerer den merkedrevne Spring-WS programmeringsmodellen.

La oss lage en MessageDispatcherServlet som brukes til å håndtere SOAP-forespørsler:

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

Vi setter den injiserte ApplicationContext gjenstand for servlet slik at Spring-WS kan finne andre vårbønner.

Vi aktiverer også transformering av WSDL-lokasjonsservlet. Dette forvandler plasseringsattributtet til såpe: adresse i WSDL slik at den gjenspeiler URL-en til den innkommende forespørselen.

Til slutt, la oss lage en StandardWsdl11Definisjon gjenstand. Dette avslører en standard WSDL 1.1 ved bruk av et XsdSchema. WSDL-navnet vil være det samme som bønnenavnet.

@Bean (navn = "land") offentlig DefaultWsdl11Definisjon defaultWsdl11Definition (XsdSchema landsSchema) {DefaultWsdl11Definition wsdl11Definition = ny DefaultWsdl11Definition (); wsdl11Definition.setPortTypeName ("CountriesPort"); wsdl11Definition.setLocationUri ("/ ws"); wsdl11Definition.setTargetNamespace ("// www.baeldung.com/springsoap/gen"); wsdl11Definition.setSchema (landsskjema); retur wsdl11Definisjon; } @Bean offentlige XsdSchema landsSchema () {returner nye SimpleXsdSchema (nye ClassPathResource ("lands.xsd")); } 

5. Testing av SOAP-prosjektet

Når prosjektkonfigurasjonen er fullført, er vi klare til å teste den.

5.1. Bygg og kjør prosjektet

Det ville være mulig å opprette en WAR-fil og distribuere den til en ekstern applikasjonsserver. Vi bruker i stedet Spring Boot, som er en raskere og enklere måte å få applikasjonen i gang.

Først legger vi til følgende klasse for å gjøre applikasjonen kjørbar:

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

Legg merke til at vi ikke bruker noen XML-filer (som web.xml) for å opprette dette programmet. Det hele er rent Java.

Nå er vi klare til å bygge og kjøre applikasjonen:

mvn spring-boot: run

For å sjekke om applikasjonen kjører riktig, kan vi åpne WSDL gjennom URL: //localhost:8080/ws/countries.wsdl

5.2. Test en SOAP-forespørsel

For å teste en forespørsel oppretter vi følgende fil og navngir den request.xml:

    Spania 

For å sende forespørselen til testserveren vår, kan vi bruke eksterne verktøy som SoapUI eller Google Chrome-utvidelsen Wizdler. En annen måte er å kjøre følgende kommando i skallet vårt:

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

Det resulterende svaret er kanskje ikke lett å lese uten innrykk eller linjeskift.

For å se det formatert, kan vi kopiere og lime det inn i IDE eller et annet verktøy. Hvis vi har installert xmllib2, kan vi føre utgangen av krøllkommandoen vår til xmllint:

krøll [kommandolinjealternativer] | xmllint --format -

Svaret skal inneholde informasjon om Spania:

     Spania 46704314 Madrid EUR 

6. Konklusjon

I denne artikkelen lærte vi hvordan du oppretter en SOAP-nettjeneste ved hjelp av Spring Boot. Vi lærte også hvordan vi genererer Java-kode fra en XSD-fil, og vi så hvordan du konfigurerer Spring Bønner som trengs for å behandle SOAP-forespørslene.

Den komplette kildekoden er tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found