Programmering

Webtjenester i Java SE, del 2: Oprettelse af SOAP-webtjenester

JAX-WS understøtter SOAP-baserede webtjenester. Del 2 i denne firedelte serie om Java SE-webtjenester definerer en SOAP-baseret enhedskonverteringstjeneste, bygger og verificerer derefter denne webservice lokalt via standard letvægts HTTP-server (diskuteret i del 1), fortolker tjenestens WSDL-dokument og får adgang til tjenesten fra en simpel klient.

Definition af en web-konverteringstjeneste til enheder

Enhedskonverteringstjenesten, som jeg har kaldt UC, består af fire funktioner til konvertering mellem centimeter og inches og mellem grader Fahrenheit og grader Celsius. Selvom dette eksempel kunne arkiveres som en enkelt Java-klasse, har jeg valgt at følge bedste praksis ved at arkitektere den som en Java-grænseflade og en Java-klasse. Liste 1 viser webtjenestens UC interface.

Notering 1. UC-webtjenestens Service Endpoint Interface

pakke ca. javajeff.uc; import javax.jws.WebMethod; import javax.jws.WebService; @WebService offentlig grænseflade UC {@WebMethod dobbelt c2f (dobbelt grader); @WebMethod dobbelt cm2in (dobbelt cm); @WebMethod dobbelt f2c (dobbelt grader); @WebMethod dobbelt in2cm (dobbelt in); }

UC beskriver en Service Endpoint Interface (SEI), som er en Java-grænseflade, der afslører en webservicegrænseflades operationer i form af abstrakte Java-metoder. Kunder kommunikerer med SOAP-baserede webtjenester via deres SEI'er.

UC erklæres for at være en SEI via @WebService kommentar. Når en Java-grænseflade eller klasse er kommenteret @WebService, alle offentlig metoder, hvis parametre, returværdier og deklarerede undtagelser følger reglerne defineret i afsnit 5 i JAX-RPC 1.1-specifikationen, beskriver webservicefunktioner. Fordi kun offentlig metoder kan erklæres i grænseflader, offentlig reserveret ord er ikke nødvendigt, når man erklærer c2f (), cm2in (), f2c ()og in2cm (). Disse metoder er implicit offentlig.

Hver metode er også kommenteret @WebMethod. Selvom @WebMethod ikke er væsentligt i dette eksempel, forstærker dets tilstedeværelse det faktum, at den annoterede metode udsætter en webservicefunktion.

Liste 2 viser webtjenestens UCImpl klasse.

Notering 2. UC-webtjenestens Service Implementation Bean

pakke ca. javajeff.uc; import javax.jws.WebService; @WebService (endpointInterface = "ca.javajeff.uc.UC") offentlig klasse UCImpl implementerer UC {@ Override offentlig dobbelt c2f (dobbelt grader) {returgrader * 9,0 / 5,0 + 32; } @ Overstyr offentlig dobbelt cm2in (dobbelt cm) {retur cm / 2,54; } @ Overstyr offentlig dobbelt f2c (dobbelt grader) {retur (grader - 32) * 5,0 / 9,0; } @ Override offentlig dobbelt in2cm (dobbelt in) {return i * 2,54; }}

UCImpl beskriver en Service Implementation Bean (SIB), som giver en implementering af SEI. Denne klasse erklæres for at være en SIB via @WebService (endpointInterface = "ca.javajeff.uc.UC") kommentar. Det endpointInterface element forbinder denne SIB til sin SEI og er nødvendig for at undgå udefinerede porttypefejl, når klientapplikationen, der præsenteres senere, køres.

Det implementerer UC klausul er ikke absolut nødvendigt. Hvis denne klausul ikke er til stede, UC grænsefladen ignoreres (og er overflødig). Det er dog en god ide at beholde implementerer UC så kompilatoren kan kontrollere, at SEI's metoder er implementeret i SIB.

SIB's metodeoverskrifter er ikke kommenteret @WebMethod fordi denne kommentar typisk bruges i sammenhæng med SEI. Men hvis du tilføjede en offentlig metode (som overholder reglerne i afsnit 5 i JAX-RPC 1.1-specifikationen) til SIB, og hvis denne metode ikke udsætter en webservicefunktion, vil du kommentere metodens overskrift @WebMethod (ekskluder = sandt). Ved at tildele rigtigt til @WebMethod's udelukke element, forhindrer du, at denne metode bliver knyttet til en operation.

Denne webservice er klar til offentliggørelse, så den er tilgængelig fra klienter. Liste 3 præsenterer a UCPublisher applikation, der udfører denne opgave i sammenhæng med standard letvægts HTTP-server.

Notering 3. Publishing UC

importere javax.xml.ws.Endpoint; importer ca.javajeff.uc.UCImpl; offentlig klasse UCPublisher {public static void main (String [] args) {Endpoint.publish ("// localhost: 9901 / UC", ny UCImpl ()); }}

Udgivelse af webservicen indebærer at foretage et enkelt opkald til EndPoint klassens Endpoint publish (String address, Object implementor) klassemetode. Det adresse parameter identificerer den URI, der er tildelt webtjenesten. Jeg har valgt at offentliggøre denne webservice på den lokale vært ved at specificere lokal vært (svarer til IP-adresse 127.0.0.1) og portnummer 9901 (som sandsynligvis er tilgængelig). Jeg har også valgt vilkårligt / UC som publikationsstien. Det implementator parameter identificerer en forekomst af UC's SIB.

Det offentliggøre() metoden opretter og offentliggør et slutpunkt for det angivne implementator objekt på det givne adresse, og bruger implementator's bemærkninger til oprettelse af Web Services Definition Language (WSDL) og XML Schema-dokumenter. Det får den nødvendige serverinfrastruktur til at blive oprettet og konfigureret af JAX-WS-implementeringen baseret på en vis standardkonfiguration. Desuden får denne metode applikationen til at køre på ubestemt tid. (På Windows-maskiner skal du trykke på Ctrl- og C-tasterne samtidigt for at afslutte applikationen.)

Opbygning og verificering af webservicen

Det er ikke svært at opbygge den tidligere definerede UC-webtjeneste. Først skal du oprette en passende bibliotekstruktur, der indeholder de relevante filer. Udfør denne opgave ved at udføre følgende trin:

  1. Opret en i den aktuelle mappe ca. vejviser. Inden for ca., lave en javajeff vejviser. Endelig indeni javajeff, lave en uc vejviser.
  2. Kopier lister 1 til a UC.java kildefil og gemme denne fil i ca / javajeff / uc.
  3. Kopier lister 2 til en UCImpl.java kildefil og gemme denne fil i ca / javajeff / uc.
  4. Kopier lister 3 til a UCPublisher.java kildefil, og gem denne fil i den aktuelle mappe, som indeholder ca. vejviser.

Den næste opgave er at kompilere disse kildefiler. Forudsat at du ikke har ændret mapper, skal du udføre følgende kommando for at kompilere disse kildefiler i Java SE 9 (udelad - tilføj moduler java.xml.ws i Java SE 6, 7 eller 8):

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

Hvis disse kildefiler kompileres med succes, skal du udføre følgende kommando for at køre dette program i Java 9 (udelad - tilføj moduler java.xml.ws i Java SE 6, 7 eller 8):

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

Mens applikationen kører, skal du bruge en webbrowser til at kontrollere, at denne webtjeneste kører korrekt og få adgang til sit WSDL-dokument. Start din yndlingswebbrowser, og indtast følgende linje i adresselinjen:

// localhost: 9901 / UC

Figur 1 viser den resulterende webside i Google Chrome-webbrowseren.

Figur 1. UCs webside giver detaljeret information om den offentliggjorte webservice

Figur 1 viser webserviceslutpunktets kvalificerede service- og portnavne. (Bemærk, at pakkenavnet er omvendt - uc.javajeff.ca i stedet for ca. javajeff.uc). En klient bruger disse navne til at få adgang til tjenesten.

Figur 1 viser også adressen URI for webtjenesten, placeringen af ​​webtjenestens WSDL-dokument (webtjenestens URI efterfulgt af ? wsdl forespørgselsstreng) og det pakkekvalificerede navn på implementeringsklassen til webservicen.

Fortolkning af webservices WSDL-dokument

Placeringen af ​​UC-webtjenestens WSDL-dokument præsenteres som et link. Klik på dette link for at se WSDL-dokumentet, hvis indhold er præsenteret i liste 4.

Notering 4. UCs WSDL-dokument

EN WSDL-dokument er et XML-dokument med en definitioner rodelement, som gør et WSDL-dokument intet mere end et sæt definitioner. Dette element inkluderer forskellige xmlns attributter til identifikation af forskellige standardnavneområder sammen med targetNameSpace og navn egenskaber:

  • Det targetNamespace attribut opretter et navneområde for alle brugerdefinerede elementer i WSDL-dokumentet (f.eks c2f element defineret via besked element med dette navn). Dette navneområde bruges til at skelne mellem de brugerdefinerede elementer i det aktuelle WSDL-dokument og brugerdefinerede elementer i importerede WSDL-dokumenter, som identificeres via WSDL'er importere element. På en lignende måde har targetNamespace attribut, der vises på en XML-skemabaseret fil skema element opretter et navneområde til dets brugerdefinerede enkle typeelementer, attributelementer og komplekse typeelementer.
  • Det navn attribut identificerer webtjenesten og bruges kun til at dokumentere tjenesten.

Indlejret indeni definitioner er typer, besked, portType, bindendeog service elementer:

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