Ohjelmointi

Verkkopalvelut Java SE: ssä, osa 2: SOAP-verkkopalvelujen luominen

JAX-WS tukee SOAP-pohjaisia ​​verkkopalveluja. Tämän Java SE -verkkopalvelujen neljän osan sarjan osa 2 määrittelee SOAP-pohjaisen yksikkömuunnosverkkopalvelun, rakentaa ja vahvistaa tämän verkkopalvelun paikallisesti oletusarvoisen kevyen HTTP-palvelimen kautta (käsitelty osassa 1), tulkitsee palvelun WSDL-asiakirjan ja käyttää palvelua yksinkertaiselta asiakkaalta.

Yksikkömuunnoksen verkkopalvelun määritteleminen

Yksikkömuunnosverkkopalvelu, jonka olen nimittänyt UC: ksi, koostuu neljästä toiminnosta muuntamiseksi senttimetrien ja tuumien sekä Fahrenheit- ja Celsius-asteiden välillä. Vaikka tämä esimerkki voitaisiin suunnitella yhdeksi Java-luokaksi, olen päättänyt noudattaa parhaita käytäntöjä rakentamalla sen Java-käyttöliittymäksi ja Java-luokaksi. Listaus 1 esittää verkkopalvelun UC käyttöliittymä.

Luettelo 1. UC-verkkopalvelun palvelun päätepisteliittymä

paketti ca.javajeff.uc; tuo javax.jws.WebMethod; tuo javax.jws.WebService; @WebService julkinen käyttöliittymä UC {@WebMethod double c2f (kaksinkertainen aste); @WebMethod kaksinkertainen cm2 (kaksinkertainen cm); @WebMethod kaksinkertainen f2c (kaksinkertainen aste); @WebMethod tuplakoko2 cm (tuplakoko); }

UC kuvaa a Palvelun päätepisteliittymä (SEI), joka on Java-käyttöliittymä, joka paljastaa verkkopalvelurajapinnan toiminnan abstraktien Java-menetelmien kannalta. Asiakkaat kommunikoivat SOAP-pohjaisten verkkopalvelujen kanssa SEI: nsä kautta.

UC ilmoitetaan SEI: ksi @WebService merkintä. Kun Java-käyttöliittymä tai luokka on merkitty @WebService, kaikki julkinen menetelmät, joiden parametrit, palautusarvot ja ilmoitetut poikkeukset noudattavat JAX-RPC 1.1 -määrityksen osassa 5 määriteltyjä sääntöjä, kuvaavat verkkopalvelutoimintoja. Koska vain julkinen - menetelmät voidaan ilmoittaa rajapinnoissa, julkinen varattu sana ei ole tarpeen ilmoitettaessa c2f (), cm2in (), f2c ()ja 2 cm (). Nämä menetelmät ovat implisiittisesti julkinen.

Jokainen menetelmä on myös merkitty @WebMethod. Siitä huolimatta @WebMethod ei ole välttämätön tässä esimerkissä, sen läsnäolo vahvistaa sitä tosiasiaa, että kommentoitu menetelmä paljastaa verkkopalvelutoiminnon.

Listaus 2 esittää verkkopalvelun UCImpl luokassa.

Listaus 2. UC-verkkopalvelun palvelun käyttöönottopapu

paketti ca.javajeff.uc; tuo javax.jws.WebService; @WebService (endpointInterface = "ca.javajeff.uc.UC") julkisen luokan UCImpl toteuttaa UC {@Override public double c2f (double Celsius) {return astetta * 9.0 / 5.0 + 32; } @Override public double cm2in (double cm) {return cm / 2,54; } @Override public double f2c (kaksinkertainen aste) {paluu (astetta - 32) * 5,0 / 9,0; } @Override public double in2cm (double in) {paluu sisään * 2,54; }}

UCImpl kuvaa a Palvelun käyttöönottopapu (SIB), joka tarjoaa SEI: n toteutuksen. Tämä luokka ilmoitetaan SIB: n kautta SIB: n kautta @WebService (endpointInterface = "ca.javajeff.uc.UC") merkintä. endpointInterface elementti yhdistää tämän SIB: n SEI: hen, ja se on välttämätön, jotta vältetään määrittelemättömät porttityypin virheet suoritettaessa myöhemmin esitettyä asiakassovellusta.

toteuttaa UC lauseke ei ole ehdottoman välttämätön. Jos tätä lauseketta ei ole, UC käyttöliittymä ohitetaan (ja se on tarpeeton). Se on kuitenkin hyvä pitää toteuttaa UC joten kääntäjä voi tarkistaa, että SEI: n menetelmät on otettu käyttöön SIB: ssä.

SIB: n menetelmän otsikoita ei ole merkitty @WebMethod koska tätä merkintää käytetään tyypillisesti SEI: n yhteydessä. Jos kuitenkin haluat lisätä a julkinen method (joka noudattaa JAX-RPC 1.1 -määrityksen osion 5 sääntöjä) SIB: lle, ja jos tämä menetelmä ei paljasta verkkopalvelutoimintoa, merkitään metodin otsikko @WebMethod (poissulkea = tosi). Määrittämällä totta että @WebMethodon sulkea pois -elementti, estät menetelmän liittämisen toimintaan.

Tämä verkkopalvelu on valmis julkaistavaksi, jotta sitä voidaan käyttää asiakkailta. Luettelossa 3 esitetään a UCPublisher sovellus, joka suorittaa tämän tehtävän oletusarvoisen kevyen HTTP-palvelimen yhteydessä.

Listaus 3. UC: n julkaiseminen

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

Verkkopalvelun julkaiseminen edellyttää yhden puhelun soittamista EndPoint luokan Päätepisteen julkaisu (merkkijono-osoite, objektin toteuttaja) luokan menetelmä. osoite parametri tunnistaa verkkopalvelulle määritetyn URI: n. Olen päättänyt julkaista tämän verkkopalvelun paikallisessa isännässä määrittelemällä paikallinen isäntä (vastaa IP-osoitetta 127.0.0.1) ja portin numero 9901 (joka on todennäköisesti käytettävissä). Lisäksi olen mielivaltaisesti valinnut / UC julkaisupoluna. toteuttaja parametri tunnistaa UCSIB.

julkaista() menetelmä luo ja julkaisee päätepisteen määritetylle toteuttaja esine annetulla osoiteja käyttää toteuttajamerkinnät Web Services Definition Language (WSDL) - ja XML Schema -asiakirjojen luomiseen. Se saa tarvittavan palvelininfrastruktuurin luomaan ja konfiguroimaan JAX-WS-toteutuksen avulla jonkin oletusasetuksen perusteella. Lisäksi tämä menetelmä saa sovelluksen toimimaan loputtomasti. (Lopeta sovellus painamalla Windows-koneissa Ctrl- ja C-näppäimiä samanaikaisesti.)

Verkkopalvelun rakentaminen ja todentaminen

Aiemmin määritetyn UC-verkkopalvelun rakentaminen ei ole vaikeaa. Ensin sinun on luotava sopiva hakemistorakenne, joka sisältää sopivat tiedostot. Suorita tämä tehtävä suorittamalla seuraavat vaiheet:

  1. Luo nykyiseen hakemistoon a noin hakemistoon. Sisällä noin, luo javajeff hakemistoon. Lopuksi, sisällä javajeff, luo uc hakemistoon.
  2. Kopioi luettelo 1 kohtaan a UC.java lähdetiedosto ja tallenna tämä tiedosto ca / javajeff / uc.
  3. Kopioi luettelo 2 kohtaan a UCImpl.java lähdetiedosto ja tallenna tämä tiedosto ca / javajeff / uc.
  4. Kopioi luettelo 3 kohtaan a UCPublisher.java lähdetiedosto ja tallenna tämä tiedosto nykyiseen hakemistoon, joka sisältää noin hakemistoon.

Seuraava tehtävä on koota nämä lähdetiedostot. Olettaen, ettet ole vaihtanut hakemistoja, suorita seuraava komento kääntääksesi nämä lähdetiedostot Java SE 9: ssä (jätä pois --add-modules java.xml.ws Java SE 6, 7 tai 8):

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

Jos nämä lähdetiedostot kääntyvät onnistuneesti, suorita seuraava komento suorittaaksesi tämän sovelluksen Java 9: ​​ssä (jätä pois --add-modules java.xml.ws Java SE 6, 7 tai 8):

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

Kun sovellus on käynnissä, tarkista verkkoselaimella, että tämä verkkopalvelu toimii oikein, ja pääset käyttämään WSDL-asiakirjaa. Käynnistä suosikkiselaimesi ja kirjoita seuraava rivi osoiteriville:

// paikallinen isäntä: 9901 / UC

Kuvassa 1 näkyy tuloksena oleva verkkosivu Google Chrome -selaimessa.

Kuva 1. UC: n verkkosivu tarjoaa yksityiskohtaista tietoa julkaistusta verkkopalvelusta

Kuvassa 1 on verkkopalvelun päätepisteen pätevä palvelu ja porttien nimet. (Huomaa, että paketin nimi on käännetty - uc.javajeff.ca sijasta ca.javajeff.uc). Asiakas käyttää näitä nimiä palvelun käyttämiseen.

Kuvassa 1 on esitetty myös verkkopalvelun osoitteen URI, verkkopalvelun WSDL-asiakirjan sijainti (verkkopalvelun URI, jonka ? wsdl kyselymerkkijono) ja verkkopalvelun toteutusluokan pakettikelpoinen nimi.

Verkkopalvelun WSDL-asiakirjan tulkinta

UC-verkkopalvelun WSDL-asiakirjan sijainti esitetään linkkinä. Napsauttamalla tätä linkkiä näet WSDL-asiakirjan, jonka sisältö on esitetty luettelossa 4.

Luettelo 4. UC: n WSDL-asiakirja

A WSDL-asiakirja on XML-asiakirja, jossa on määritelmät root-elementti, joka tekee WSDL-dokumentista vain joukon määritelmiä. Tämä elementti sisältää erilaisia xmlns määritteet erilaisten tavallisten nimitilojen tunnistamiseksi yhdessä targetNameSpace ja nimi määritteet:

  • targetNamespace attribute luo nimitilan kaikille käyttäjän määrittämille elementeille WSDL-asiakirjassa (kuten c2f elementti, joka määritetään viesti nimi tällä nimellä). Tätä nimitilaa käytetään erottamaan nykyisen WSDL-asiakirjan käyttäjän määrittämät elementit ja tuotujen WSDL-asiakirjojen käyttäjän määrittelemät elementit, jotka tunnistetaan WSDL: n kautta tuonti elementti. Samalla tavalla targetNamespace attribuutti, joka näkyy XML-skeema-pohjaisissa tiedostoissa skeema elementti luo nimitilan käyttäjän määrittelemille yksinkertaisen tyypin elementeille, attribuuttielementeille ja monimutkaisille tyypin elementeille.
  • nimi attribuutti identifioi verkkopalvelun ja sitä käytetään vain palvelun dokumentointiin.

Sisäkkäin määritelmät ovat tyypit, viesti, portType, sitovaja palvelu elementit: