Programmering

Webtjenester i Java SE, del 2: Opprette SOAP-webtjenester

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 @WebMethods 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 UCer SIB.

De publisere() metoden oppretter og publiserer et sluttpunkt for det angitte implementator objekt på det gitte adresse, og bruker implementatorsine 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:

  1. Opprett en i den aktuelle katalogen ca. katalog. Innenfor ca., lage en javajeff katalog. Endelig innen javajeff, lage en uc katalog.
  2. Kopier oppføring 1 til a UC.java kildefilen og lagre denne filen i ca / javajeff / uc.
  3. Kopier oppføring 2 til a UCImpl.java kildefilen og lagre denne filen i ca / javajeff / uc.
  4. Kopier oppføring 3 til a UCPublisher.java kildefilen og lagre denne filen i den gjeldende katalogen, som inneholder ca. 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 eksempel c2f element definert via beskjed 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 har targetNamespace attributt som vises på en XML Schema-basert fil skjema 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:

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