Web usluge u Java SE, 2. dio: Stvaranje SOAP web usluga

JAX-WS podržava web usluge temeljene na SOAP-u. Dio 2 ove četverodijelne serije o Java SE web uslugama definira web uslugu za pretvorbu jedinica zasnovanu na SOAP-u, gradi i zatim lokalno provjerava ovu web uslugu putem zadanog laganog HTTP poslužitelja (raspravljano u 1. dijelu), tumači WSDL dokument usluge. i pristupa usluzi od jednostavnog klijenta.

Definiranje web usluge za pretvorbu jedinica

Web usluga za pretvorbu jedinica, koju sam nazvao UC, sastoji se od četiri funkcije za pretvaranje između centimetara i inča te između stupnjeva Fahrenheita i Celzijevih stupnjeva. Iako bi se ovaj primjer mogao oblikovati kao jedna Java klasa, odlučio sam slijediti najbolje primjere prakse tako što sam ga oblikovao kao Java sučelje i Java klasu. Popis 1 predstavlja UCsučelje web usluge .

Popis 1. Sučelje krajnje točke usluge UC web usluge

package ca.javajeff.uc; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface UC { @WebMethod double c2f(double degrees); @WebMethod double cm2in(double cm); @WebMethod double f2c(double degrees); @WebMethod double in2cm(double in); }

UCopisuje sučelje krajnje točke usluge (SEI) , koje je Java sučelje koje izlaže rad sučelja web usluga u smislu apstraktnih Java metoda. Klijenti komuniciraju s web uslugama temeljenim na SOAP-u putem svojih SEI-a.

UCproglašava se SEI-jem putem @WebServicebilješke. Kada su Java sučelje ili klasa označeni @WebService, sve publicmetode čiji parametri, povratne vrijednosti i deklarirane iznimke slijede pravila definirana u odjeljku 5 specifikacije JAX-RPC 1.1, koji opisuju operacije web usluga. Jer samo publicmetode mogu biti proglašen u sučelja, publicrezervirana riječ nije potrebno kada se izjavljuje c2f(), cm2in(), f2c(), i in2cm(). Te su metode implicitno public.

Svaka metoda je također označena @WebMethod. Iako @WebMethodnije bitna u ovom primjeru, njezina prisutnost pojačava činjenicu da anotirana metoda izlaže operaciju web usluge.

Popis 2 predstavlja UCImplklasu web usluge .

Popis 2. Bean za implementaciju usluge UC web usluge

package ca.javajeff.uc; import javax.jws.WebService; @WebService(endpointInterface = "ca.javajeff.uc.UC") public class UCImpl implements UC { @Override public double c2f(double degrees) { return degrees * 9.0 / 5.0 + 32; } @Override public double cm2in(double cm) { return cm / 2.54; } @Override public double f2c(double degrees) { return (degrees - 32) * 5.0 / 9.0; } @Override public double in2cm(double in) { return in * 2.54; } }

UCImplopisuje Bean za implementaciju usluge (SIB) , koji pruža implementaciju SEI. Ova je klasa putem @WebService(endpointInterface = "ca.javajeff.uc.UC")bilješke proglašena SIB-om . endpointInterfaceElement povezuje taj SIB svojoj SEI, te je potrebno da se izbjegne nedefinirane pogreške tipa luka kada je pokrenut zahtjev klijenta predstavljen kasnije.

implements UCKlauzula nije apsolutno neophodno. Ako ova klauzula nije prisutna, UCsučelje se zanemaruje (i suvišno je). Međutim, bilo bi dobro zadržati implements UCkako bi kompajler mogao provjeriti jesu li metode SEI implementirane u SIB.

Zaglavlja metode SIB-a nisu označena, @WebMethodjer se ta napomena obično koristi u kontekstu SEI-a. Međutim, ako biste publicSIB- u dodali metodu (koja je u skladu s pravilima iz odjeljka 5. specifikacije JAX-RPC 1.1), i ako ova metoda ne izlaže operaciju web usluge, zabilježili biste zaglavlje metode @WebMethod(exclude = true). Dodjeljivanjem trueda @WebMethod„s excludeelementom, možete spriječiti da se metoda od toga da bude povezan s operacijom.

Ova web usluga spremna je za objavljivanje kako bi joj se moglo pristupiti od klijenata. Popis 3 predstavlja UCPublisheraplikaciju koja izvršava ovaj zadatak u kontekstu zadanog laganog HTTP poslužitelja.

Popis 3. Objavljivanje UC-a

import javax.xml.ws.Endpoint; import ca.javajeff.uc.UCImpl; public class UCPublisher { public static void main(String[] args) { Endpoint.publish("//localhost:9901/UC", new UCImpl()); } }

Objavljivanje na web-uslugu uključuje izradu jednog poziva prema EndPointklasi je Endpoint publish(String address, Object implementor)metoda klase. U addressparametar određuje URI dodijeljen web servisa. Odlučio sam objaviti ovu web uslugu na lokalnom hostu navodeći localhost(ekvivalentno IP adresi 127.0.0.1) i broj porta 9901(koji je najvjerojatnije dostupan). Također, proizvoljno sam odabrao /UCput objavljivanja. U implementorparametar određuje instancu UC„s SIB.

publish()Način stvara i objavljuje završna točka za navedeni implementorobjekt na zadani address, a koristi implementor„S komentara za izradu Web Services Definition Language (WSDL) i XML sheme dokumenata. Uzrokuje stvaranje i konfiguriranje potrebne poslužiteljske infrastrukture pomoću JAX-WS implementacije na temelju neke zadane konfiguracije. Nadalje, ova metoda uzrokuje da aplikacija radi neograničeno. (Na Windows računalima istovremeno pritisnite tipke Ctrl i C da biste prekinuli program.)

Izgradnja i provjera web usluge

Nije teško izgraditi prethodno definiranu UC web uslugu. Prvo morate stvoriti prikladnu strukturu direktorija koja sadrži odgovarajuće datoteke. Obavite ovaj zadatak izvršavanjem sljedećih koraka:

  1. Unutar trenutnog direktorija stvorite cadirektorij. Unutar castvorite javajeffdirektorij. Napokon, unutar javajeff, stvorite ucdirektorij.
  2. Kopirajte Unos 1 u UC.javaizvornu datoteku i spremite je u ca/javajeff/uc.
  3. Kopirajte Popis 2 u UCImpl.javaizvornu datoteku i spremite je u ca/javajeff/uc.
  4. Kopirajte Popis 3 u UCPublisher.javaizvornu datoteku i spremite je u trenutni direktorij koji sadrži cadirektorij.

Sljedeći je zadatak sastaviti ove izvorne datoteke. Pod pretpostavkom da niste promijenili direktorije, izvršite sljedeću naredbu za kompajliranje ovih izvornih datoteka u Javi SE 9 (izostavite --add-modules java.xml.wsu Javi SE 6, 7 ili 8):

javac --add-modules java.xml.ws UCPublisher.java

Ako se ove izvorne datoteke uspješno kompajliraju, izvršite sljedeću naredbu za pokretanje ove aplikacije u Javi 9 (izostavite --add-modules java.xml.wsu Javi SE 6, 7 ili 8):

java --add-modules java.xml.ws UCPublisher

Dok se aplikacija izvodi, koristite web preglednik da biste provjerili radi li ta web usluga ispravno i da biste pristupili svom WSDL dokumentu. Pokrenite svoj omiljeni web preglednik i unesite sljedeći redak u adresnu traku:

//localhost:9901/UC

Slika 1 prikazuje rezultirajuću web stranicu u web pregledniku Google Chrome.

Slika 1. Web stranica UC-a pruža detaljne informacije o objavljenoj web usluzi

Slika 1 prikazuje kvalificirane usluge i nazive priključaka krajnje točke web usluge. (Primijetite da je naziv paketa obrnuto - uc.javajeff.caumjesto ca.javajeff.uc). Klijent koristi ta imena za pristup usluzi.

Na slici 1. također su prikazani URI adrese web usluge, mjesto WSDL dokumenta web usluge (URI web usluge sufiksiran ?wsdlnizom upita) i naziv kvalificiranog paketa klase implementacije web usluge.

Tumačenje WSDL dokumenta web usluge

Mjesto WSDL dokumenta UC web usluge prikazano je kao poveznica. Kliknite ovu vezu da biste pogledali WSDL dokument, čiji je sadržaj predstavljen na popisu 4.

Popis 4. UC-ov WSDL dokument

WSDL dokument je XML dokument s definitionskorijenskim elementom, što čini ništa WSDL dokument više nego skup definicija. Ovaj element uključuje različite xmlnsatribute za prepoznavanje različitih standardnih imenskom prostoru, uz targetNameSpacei nameatributi:

  • The targetNamespace attribute creates a namespace for all user-defined elements in the WSDL document (such as the c2f element defined via the message element with this name). This namespace is used to distinguish between the user-defined elements of the current WSDL document and user-defined elements of imported WSDL documents, which are identified via WSDL's import element. In a similar fashion, the targetNamespace attribute that appears on an XML Schema-based file's schema element creates a namespace for its user-defined simple type elements, attribute elements, and complex type elements.
  • The name attribute identifies the Web service and is used only to document the service.

Nested within definitions are types, message, portType, binding, and service elements: