JAX-WS støtter SOAP-baserte webtjenester. Del 2 av denne firedelte serien på Java SE-webtjenester definerer en SOAP-basert enhetskonverteringstjeneste, bygger og verifiserer deretter denne nettjenesten lokalt via standard lettvekts HTTP-server (diskutert i del 1), tolker tjenestens WSDL-dokument , og får tilgang til tjenesten fra en enkel klient.
Definere en nettkonverteringstjeneste
Enhetskonverteringstjenesten, som jeg har kalt UC, består av fire funksjoner for konvertering mellom centimeter og tommer og mellom grader Fahrenheit og grader Celsius. Selv om dette eksemplet kan arkiveres som en enkelt Java-klasse, har jeg valgt å følge beste praksis ved å arkitere den som et Java-grensesnitt og en Java-klasse. Oppføring 1 presenterer webtjenestens UC
grensesnitt.
Oppføring 1. UC Web-tjenestens Service Endpoint Interface
pakke ca. javajeff.uc; importere javax.jws.WebMethod; importere javax.jws.WebService; @WebService offentlig grensesnitt UC {@WebMethod dobbelt c2f (doble grader); @WebMethod dobbel cm2in (dobbel cm); @WebMethod dobbelt f2c (doble grader); @WebMethod dobbelt in2cm (dobbelt inn); }
UC
beskriver en Service Endpoint Interface (SEI), som er et Java-grensesnitt som avslører operasjonene til et nettjenestegrensesnitt når det gjelder abstrakte Java-metoder. Klienter kommuniserer med SOAP-baserte webtjenester via sine SEI-er.
UC
er erklært å være en SEI via @Nettjeneste
kommentar. Når et Java-grensesnitt eller klasse er merket @Nettjeneste
, alle offentlig
metoder hvis parametere, returverdier og deklarerte unntak følger reglene som er definert i avsnitt 5 i JAX-RPC 1.1-spesifikasjonen, beskriver nettjenestedrift. Fordi bare offentlig
metoder kan deklareres i grensesnitt, offentlig
reservert ord er ikke nødvendig når du erklærer c2f ()
, cm2in ()
, f2c ()
, og in2cm ()
. Disse metodene er implisitt offentlig
.
Hver metode er også kommentert @WebMethod
. Selv om @WebMethod
ikke er viktig i dette eksemplet, forsterker dets tilstedeværelse det faktum at den merkede metoden avslører en webtjenesteoperasjon.
Oppføring 2 presenterer webtjenestene UCImpl
klasse.
Oppføring 2. UC Web-tjenestens Service Implementation Bean
pakke ca. javajeff.uc; importere javax.jws.WebService; @WebService (endpointInterface = "ca.javajeff.uc.UC") offentlig klasse UCImpl implementerer UC {@Override offentlig dobbel c2f (dobbel grad) {retur grader * 9,0 / 5,0 + 32; } @ Override offentlig dobbel cm2in (dobbel cm) {retur cm / 2,54; } @ Overstyr offentlig dobbel f2c (dobbel grad) {retur (grader - 32) * 5.0 / 9.0; } @ Override public double in2cm (double in) {return in * 2.54; }}
UCImpl
beskriver en Service Implementation Bean (SIB), som gir en implementering av SEI. Denne klassen er erklært å være en SIB via @WebService (endpointInterface = "ca.javajeff.uc.UC")
kommentar. De endpointInterface
elementet kobler denne SIB til SEI, og er nødvendig for å unngå udefinerte porttypefeil når du kjører klientapplikasjonen presentert senere.
De implementerer UC
klausul er ikke helt nødvendig. Hvis denne paragrafen ikke er tilstede, UC
grensesnittet blir ignorert (og er overflødig). Det er imidlertid en god ide å beholde implementerer UC
slik at kompilatoren kan verifisere at SEIs metoder er implementert i SIB.
SIBs metodeoverskrifter er ikke kommentert @WebMethod
fordi denne merknaden vanligvis brukes i sammenheng med SEI. Men hvis du skulle legge til en offentlig
metode (som er i samsvar med reglene i Seksjon 5 i JAX-RPC 1.1 spesifikasjonen) til SIB, og hvis denne metoden ikke avslører en webtjenesteoperasjon, vil du kommentere metodens overskrift @WebMethod (ekskluder = sant)
. Ved å tildele ekte
til @WebMethod
s utelukke
element, forhindrer du at metoden blir assosiert med en operasjon.
Denne webtjenesten er klar til å bli publisert slik at den er tilgjengelig fra klienter. Oppføring 3 presenterer a UCPublisher
applikasjon som utfører denne oppgaven i sammenheng med standard lettvekts HTTP-server.
Oppføring 3. Publisering UC
importere javax.xml.ws.Endpoint; importere ca.javajeff.uc.UCImpl; public class UCPublisher {public static void main (String [] args) {Endpoint.publish ("// localhost: 9901 / UC", new UCImpl ()); }}
Publisering av nettjenesten innebærer å ringe en enkelt samtale til EndPoint
klassen Endpoint publish (strengadresse, objektimplementator)
klassemetode. De adresse
parameteren identifiserer URI tilordnet webtjenesten. Jeg har valgt å publisere denne nettjenesten på den lokale verten ved å spesifisere lokal vert
(tilsvarer IP-adresse 127.0.0.1) og portnummer 9901
(som mest sannsynlig er tilgjengelig). Jeg har også valgt vilkårlig / UC
som publikasjonsvei. De implementator
parameter identifiserer en forekomst av UC
er SIB.
De publisere()
metoden oppretter og publiserer et sluttpunkt for det angitte implementator
objekt på det gitte adresse
, og bruker implementator
sine merknader for å lage Web Services Definition Language (WSDL) og XML Schema-dokumenter. Det fører til at den nødvendige serverinfrastrukturen opprettes og konfigureres av JAX-WS-implementeringen basert på noen standardkonfigurasjoner. Videre fører denne metoden til at applikasjonen kjører på ubestemt tid. (På Windows-maskiner trykker du Ctrl og C samtidig for å avslutte applikasjonen.)
Bygge og verifisere nettjenesten
Det er ikke vanskelig å bygge den tidligere definerte UC-webtjenesten. Først må du opprette en passende katalogstruktur som inneholder de aktuelle filene. Utfør denne oppgaven ved å utføre følgende trinn:
- Opprett en i den aktuelle katalogen
ca.
katalog. Innenforca.
, lage enjavajeff
katalog. Endelig innenjavajeff
, lage enuc
katalog. - Kopier oppføring 1 til a
UC.java
kildefilen og lagre denne filen ica / javajeff / uc
. - Kopier oppføring 2 til a
UCImpl.java
kildefilen og lagre denne filen ica / javajeff / uc
. - Kopier oppføring 3 til a
UCPublisher.java
kildefilen og lagre denne filen i den gjeldende katalogen, som inneholderca.
katalog.
Neste oppgave er å kompilere disse kildefilene. Forutsatt at du ikke har endret kataloger, utfør følgende kommando for å kompilere disse kildefilene i Java SE 9 (utelat - legge til moduler java.xml.ws
i Java SE 6, 7 eller 8):
javac --add-modules java.xml.ws UCPublisher.java
Hvis disse kildefilene kompileres, kan du utføre følgende kommando for å kjøre dette programmet i Java 9 (utelat - legge til moduler java.xml.ws
i Java SE 6, 7 eller 8):
java - legge til moduler java.xml.ws UCPublisher
Mens applikasjonen kjører, bruk en nettleser for å bekrefte at denne nettjenesten kjører riktig og for å få tilgang til WSDL-dokumentet. Start din favoritt nettleser og skriv inn følgende linje i adresselinjen:
// localhost: 9901 / UC
Figur 1 viser den resulterende websiden i Google Chrome-nettleseren.
Figur 1. UCs webside gir detaljert informasjon om den publiserte webtjenesten
Figur 1 viser nettjenestens sluttpunktets kvalifiserte service- og portnavn. (Legg merke til at pakkenavnet er omvendt - uc.javajeff.ca
i stedet for ca.javajeff.uc
). En klient bruker disse navnene for å få tilgang til tjenesten.
Figur 1 viser også adressen URI til webtjenesten, plasseringen til webtjenestens WSDL-dokument (webtjenesten URI etterfulgt av ? wsdl
spørringsstreng) og det pakkekvalifiserte navnet på implementeringsklassen for webtjenester.
Tolker nettjenestens WSDL-dokument
Plasseringen til UC Web-tjenestens WSDL-dokument presenteres som en lenke. Klikk på denne lenken for å se WSDL-dokumentet, hvis innhold er presentert i Listing 4.
Oppføring 4. UCs WSDL-dokument
EN WSDL-dokument er et XML-dokument med en definisjoner
rotelement, som gjør et WSDL-dokument til ingenting mer enn et sett med definisjoner. Dette elementet inkluderer forskjellige xmlns
attributter for å identifisere forskjellige standard navneområder, sammen med targetNameSpace
og Navn
attributter:
- De
targetNamespace
attributt oppretter et navnerom for alle brukerdefinerte elementer i WSDL-dokumentet (for eksempelc2f
element definert viabeskjed
element med dette navnet). Dette navneområdet brukes til å skille mellom de brukerdefinerte elementene i gjeldende WSDL-dokument og brukerdefinerte elementer i importerte WSDL-dokumenter, som identifiseres via WSDL-er.import
element. På en lignende måte hartargetNamespace
attributt som vises på en XML Schema-basert filskjema
element oppretter et navneområde for brukerdefinerte enkle typeelementer, attributtelementer og komplekse typeelementer. - De
Navn
attributt identifiserer nettjenesten og brukes bare til å dokumentere tjenesten.
Nestet innenfor definisjoner
er typer
, beskjed
, portType
, bindende
, og service
elementer: