Programování

Webové služby v prostředí Java SE, část 2: Vytváření webových služeb SOAP

JAX-WS podporuje webové služby založené na protokolu SOAP. Část 2 této čtyřdílné řady o webových službách Java SE definuje webovou službu pro převod jednotek založenou na protokolu SOAP, sestavuje a poté lokálně ověřuje tuto webovou službu prostřednictvím výchozího lehkého serveru HTTP (popsaného v části 1), interpretuje dokument WSDL služby , a přistupuje ke službě od jednoduchého klienta.

Definování webové služby pro převod jednotek

Webová služba pro převod jednotek, kterou jsem pojmenoval UC, se skládá ze čtyř funkcí pro převod mezi centimetry a palci a mezi stupni Fahrenheita a stupni Celsia. I když tento příklad lze navrhnout jako jednu třídu Java, rozhodl jsem se postupovat podle osvědčených postupů tím, že jsem jej vytvořil jako rozhraní Java a třídu Java. Výpis 1 představuje webové služby VIDÍŠ rozhraní.

Výpis 1. Rozhraní koncového bodu služby webové služby UC

balíček ca.javajeff.uc; import javax.jws.WebMethod; import javax.jws.WebService; @WebService veřejné rozhraní UC {@WebMethod double c2f (dvojité stupně); @WebMethod double cm2in (double cm); @WebMethod double f2c (dvojité stupně); @WebMethod double in2cm (double in); }

VIDÍŠ popisuje a Service Endpoint Interface (SEI), což je rozhraní Java, které odhaluje operace rozhraní webové služby z hlediska abstraktních metod Java. Klienti komunikují s webovými službami založenými na protokolu SOAP prostřednictvím svých SEI.

VIDÍŠ je prohlášen za SEI prostřednictvím @Webová služba anotace. Když je anotováno rozhraní nebo třída Java @Webová služba, Všechno veřejnost metody, jejichž parametry, návratové hodnoty a deklarované výjimky se řídí pravidly definovanými v části 5 specifikace JAX-RPC 1.1, popisují operace webových služeb. Protože jen veřejnost metody lze deklarovat na rozhraních, veřejnost vyhrazené slovo není při deklaraci nutné c2f (), cm2in (), f2c (), a in2cm (). Tyto metody jsou implicitně veřejnost.

Každá metoda je také anotována @WebMethod. Ačkoli @WebMethod není v tomto příkladu zásadní, jeho přítomnost posiluje skutečnost, že anotovaná metoda odhaluje operaci webové služby.

Výpis 2 představuje webové služby UCImpl třída.

Výpis 2. Bean webové služby UC Web Service

balíček ca.javajeff.uc; import javax.jws.WebService; @WebService (endpointInterface = "ca.javajeff.uc.UC") veřejná třída UCImpl implementuje UC {@Override public double c2f (dvojité stupně) {návratové stupně * 9,0 / 5,0 + 32; } @Override public double cm2in (double cm) {return cm / 2.54; } @Override public double f2c (dvojité stupně) {návrat (stupně - 32) * 5,0 / 9,0; } @Override public double in2cm (double in) {návrat za * 2,54; }}

UCImpl popisuje a Servisní implementace Bean (SIB), který zajišťuje implementaci SEI. Tato třída je deklarována jako SIB prostřednictvím @WebService (endpointInterface = "ca.javajeff.uc.UC") anotace. The endpointInterface element připojuje tento SIB k jeho SEI a je nutné se vyhnout nedefinovaným chybám typu portu při spuštění klientské aplikace uvedené později.

The implementuje UC klauzule není nezbytně nutná. Pokud tato klauzule není k dispozici, VIDÍŠ rozhraní je ignorováno (a je nadbytečné). Je však dobrý nápad dodržet implementuje UC takže překladač může ověřit, že metody SEI byly implementovány v SIB.

Hlavičky metod SIB nejsou anotovány @WebMethod protože tato anotace se obvykle používá v kontextu SEI. Pokud byste však přidali a veřejnost metoda (která odpovídá pravidlům v části 5 specifikace JAX-RPC 1.1) na SIB, a pokud tato metoda nevystavuje operaci webové služby, anotujete hlavičku metody @WebMethod (vylúčit = true). Přiřazením skutečný na @WebMethodje vyloučit prvku, zabráníte tomu, aby byla tato metoda přidružena k operaci.

Tato webová služba je připravena k publikování, aby k ní měli přístup klienti. Výpis 3 představuje a Vydavatel UCP aplikace, která plní tento úkol v kontextu výchozího lehkého serveru HTTP.

Výpis 3. Publikování UC

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 ()); }}

Publikování webové služby zahrnuje uskutečnění jediného volání na Koncový bod třídy Publikování koncového bodu (adresa řetězce, implementátor objektu) třídní metoda. The adresa parametr identifikuje URI přiřazený webové službě. Rozhodl jsem se publikovat tuto webovou službu na místním hostiteli zadáním localhost (ekvivalent IP adresy 127.0.0.1) a číslo portu 9901 (který je s největší pravděpodobností k dispozici). Také jsem si libovolně vybral /VIDÍŠ jako publikační cestu. The realizátor parametr identifikuje instanci VIDÍŠje SIB.

The publikovat() metoda vytvoří a publikuje koncový bod pro zadaný realizátor předmět v daném adresaa používá realizátorAnotace k vytváření dokumentů WSDL (Web Services Definition Language) a schématu XML. Způsobuje, že je nezbytná serverová infrastruktura vytvořena a nakonfigurována implementací JAX-WS na základě nějaké výchozí konfigurace. Kromě toho tato metoda způsobí, že aplikace běží neomezeně dlouho. (Na počítačích s Windows ukončete aplikaci současným stisknutím kláves Ctrl a C.)

Vytváření a ověřování webové služby

Není těžké vybudovat dříve definovanou webovou službu UC. Nejprve musíte vytvořit vhodnou adresářovou strukturu obsahující příslušné soubory. Splňte tento úkol provedením následujících kroků:

  1. V aktuálním adresáři vytvořte a ca. adresář. V rámci ca., vytvořit javajeff adresář. Konečně uvnitř javajeff, vytvořit vidíš adresář.
  2. Kopírovat výpis 1 do a UC.java zdrojový soubor a uložte jej do ca / javajeff / uc.
  3. Kopírovat výpis 2 do a UCImpl.java zdrojový soubor a uložte jej do ca / javajeff / uc.
  4. Zkopírujte výpis 3 do a UCPublisher.java zdrojový soubor a uložte tento soubor do aktuálního adresáře, který obsahuje ca. adresář.

Dalším úkolem je kompilace těchto zdrojových souborů. Za předpokladu, že jste nezměnili adresáře, proveďte následující příkaz ke kompilaci těchto zdrojových souborů v prostředí Java SE 9 (vynechejte --add-modules java.xml.ws v prostředí Java SE 6, 7 nebo 8):

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

Pokud se tyto zdrojové soubory úspěšně zkompilují, spusťte následující příkaz pro spuštění této aplikace v prostředí Java 9 (vynechejte --add-modules java.xml.ws v prostředí Java SE 6, 7 nebo 8):

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

Když je aplikace spuštěna, použijte webový prohlížeč k ověření, že tato webová služba běží správně, a k přístupu k jejímu dokumentu WSDL. Spusťte svůj oblíbený webový prohlížeč a do adresního řádku zadejte následující řádek:

// localhost: 9901 / UC

Obrázek 1 zobrazuje výslednou webovou stránku ve webovém prohlížeči Google Chrome.

Obrázek 1. Webová stránka UC poskytuje podrobné informace o publikované webové službě

Obrázek 1 představuje kvalifikované služby a názvy portů koncového bodu webové služby. (Všimněte si, že název balíčku byl obrácen - uc.javajeff.ca namísto ca.javajeff.uc). Klient používá tato jména pro přístup ke službě.

Obrázek 1 také představuje URI adresy webové služby, umístění dokumentu WSDL webové služby (URI webové služby doplněné ? wsdl řetězec dotazu) a název třídy implementace webové služby kvalifikovaný pro balíček.

Interpretace dokumentu WSDL webové služby

Umístění dokumentu WSDL webové služby UC je prezentováno jako odkaz. Kliknutím na tento odkaz zobrazíte dokument WSDL, jehož obsah je uveden v seznamu 4.

Výpis 4. Dokument WSDL UC

A Dokument WSDL je dokument XML s a definice kořenový prvek, díky kterému není dokument WSDL ničím jiným než sadou definic. Tento prvek zahrnuje různé xmlns atributy pro identifikaci různých standardních jmenných prostorů, spolu s targetNameSpace a název atributy:

  • The targetNamespace Atribut vytvoří obor názvů pro všechny uživatelem definované prvky v dokumentu WSDL (například c2f prvek definovaný prostřednictvím zpráva prvek s tímto názvem). Tento obor názvů se používá k rozlišení mezi uživatelem definovanými prvky aktuálního dokumentu WSDL a uživatelem definovanými prvky importovaných dokumentů WSDL, které jsou identifikovány pomocí WSDL import živel. Podobným způsobem také targetNamespace atribut, který se objeví v souboru založeném na schématu XML schéma element vytvoří obor názvů pro své uživatelem definované prvky jednoduchého typu, prvky atributů a prvky komplexního typu.
  • The název Atribut identifikuje webovou službu a slouží pouze k dokumentaci služby.

Vnořené uvnitř definice jsou typy, zpráva, portType, vazba, a servis elementy: