Jakarta XML Web Service (JAX-WS) w Javie

JAX-WS jest częścią Jakarta Enterprice Edition (Jakarta EE). Jest technologią, która pozwala tworzyć usługi sieciowe (ang. web services), czyli aplikacje w architekturze klient-serwer. Dane przesyłane są w formacie XML, a komunikacja jest możliwa dzięki protokołowi HTTP.

Dużą zaletą platformy JAX-WS jest możliwość komunikacji klienta oraz serwera działających w różnych technologiach. Dzięki temu klient działający w technologii Java potrafi współpracować z serwerem, który pracuje w technologii .Net. Taka elastyczność jest możliwa dzięki wykorzystaniu języka WSDL (ang. Web Services Description Language), który opisuje punkty dostępu usług sieciowych korzystając z formatu XML.

JAX-WS wykorzystuje protokół SOAP (ang. Simple Object Access Protocol). Przesyła on wywołania oraz odpowiedzi w postaci plików XML. Użycie SOAP umożliwia komunikację między aplikacjami niezależnie od platformy oraz użytej technologii. Protokołem, który umożliwia komunikację jest HTTP, który wspiera praktycznie każdy serwer.

Tworzenie Web Service w technologii JAX-WS

Podobnie jak w przypadku JAX-RS również w tym przypadku będziemy stosować adnotacje.
@Webservice – dodanie tej adnotacji przed klasą oznacza, że będzie ona klasą węzła końcowego (ang. Web service endpoint).
@WebMethod – dodanie tej adnotacji oznacza, że ta metoda będzie widoczna dla klienta, a nie wyłącznie używana na serwerze.

Węzły końcowe w JAX-WS

Aby węzły końcowe działały prawidłowo muszą spełnić kilka warunków. Poniżej prezentujemy ich listę.

• Klasę, która implementuje węzeł końcowy musi poprzedzać adntoacja @Webservice. Klasa ta nie może być abstrakcyjna oraz nie może posiadać modyfikatora final.
• Metodę, która jest wystawiona dla klienta musi poprzedzać adntoacja @WebMethod. Musi posiadać modyfikator public, nie może posiadać modyfikatora final oraz nie może być statyczna.
• Metody, które są wystawione na zewnątrz przy węźle końcowym muszą zwracać wartości oraz przyjmować parametry zgodne ze specyfikacją JAXB.

Implementacja serwera JAX-WS w Eclipse

Poniżej pokażemy krok po kroku jak utworzyć prosty web service oparty na technologii JAX-WS w Eclipse. Nasz serwer będzie świadczył prostą usługę. Będzie przyjmował argument w postaci imienia, a w odpowiedzi będzie zwracał powitanie do użytkownika.

Projekt w Eclipse

Pierwszym krokiem jest utworzenie nowego projektu. Klikamy New → Dynamic Web Project. Eclipse wyświetli nam poniższe okienko.

JAX-WS Tworzenie projektu w Eclipse

JAX-WS Tworzenie projektu w Eclipse

W polu nazwy wpisujemy Webserver_WS, a następnie można przejrzeć kolejne okienka i zakończyć procedurę klikając Finish.

Tworzenie usługi udostępnianej przez web service

Pierwszym krokiem będzie napisanie interfejsu, który zagwarantuje umieszczenie po stronie usługi metody, która zwróci nam tekst powitalny. Poniżej znajduje się kod interfejsu WS.

Następnie utworzymy klasę, która będzie węzłem końcowym w naszym web service. Klata ta implementuje interfejs WS.

Wykonując powyższe czynności jesteśmy gotowi, aby umieścić usługę na serwerze. W tym celu należy kliknąć prawym przyciskiem myszy na klasę Usluga i z menu kontekstowego wybrać new → other. Pojawi się następujące okienko.

JAX-WS Tworzenie web service XML

JAX-WS Tworzenie web service XML

W wyszukiwarce wystarczy napisać „web”, a następnie wybrać Web service. Pojawi się kolejne okienko. Zobaczymy tu możliwość wyboru typu web service. W naszym przykładzie będzie to Bottom up Java Bean. W dolnej części widać klienta i będzie nim Java Proxy – mówiąc inaczej klientem będzie klasa pośrednicząca. Klikamy Next.

JAX-WS Tworzenie web service XML klient serwer

JAX-WS Tworzenie web service XML klient serwer

W tym okienku możemy zaznaczyć, które metody będą dostępne na zewnątrz (dla klienta), a które są do wykorzystania jedynie przez serwer. Ponownie klikamy Next.

JAX-WS web service XML metody wystawione dla klienta

JAX-WS web service XML metody wystawione dla klienta

W tym momencie możemy od razu wystartować usługę oraz umieścić ją na serwerze. Klikamy przycisk Start server. W tle będą widoczne komunikaty startu serwera TomEE. Cały proces kończymy przyciskiem Finish.

JAX-WS web service XML start serwera

JAX-WS web service XML start serwera

Odczytanie pliku WSDL

W tym celu otwieramy przeglądarkę, a następnie w pasku adresu wpisujemy taki adres.

http://localhost:8080/Webserver_WS/services/Usluga?wsdl

Na ekranie powinien pojawić się dokument WSDL. Warto zapamiętać ten adres, gdyż przyda nam się podczas tworzenia klienta.

Implementacja klienta JAX-WS

Nasz klient będzie prostą aplikacją konsolową tak, aby pokazać, że wcale nie musi to być aplikacja web. Zamysł jest taki, żeby aplikacja przesłała przy pomocy protokołu SOAP komunikat z imieniem, a następnie żeby serwer zwrócił tekst powitalny.

Projekt w Eclipse

Pierwszym krokiem będzie utworzenie projektu, tym razem zwykłego Java projekt. Środowisko uruchomieniowe ustawiamy jako JEE 1.8. Chcemy pokazać, że klient nie musi być webowy, a zwykły konsolowy. W projekcie tworzymy paczkę pl.programistajava.clnt, a następnie w wewnątrz umieszczamy klasę Klient. Podczas tworzenia można zaznaczyć opcje utworzenia metody statycznej main.

Po wykonaniu powyższych czynności klikamy na projekt i wybieramy new → other i w okienku opcję web service client. Pokaże nam się podobne okienko jak podczas tworzenia serwera.

JAX-WS web service XML klient

JAX-WS web service XML klient

W polu Service definition wpisujemy adres pliku WSDL, który wskazaliśmy wcześniej w przeglądarce. Klient zostaje Java proxy. Klikamy Next, i dalej Finish.

Projekt klienta

Po wykonaniu wcześniejszych czynności w projekcie pojawi pakiet, w którym znajduje się kilka interfejsów i klas. Zwróćmy uwagę szczególnie na interfejs Usluga oraz klasę UslugaProxy.

Interfejs Usluga umożliwia zaimplementowanie własnej klasy klienta, natomiast klasa UslugaProxy jest gotowa do użycia. Zawiera naszą wcześniej przygotowaną metodę sayHello().

JAX-WS projekt Eclipse klient

JAX-WS projekt Eclipse klient

Klasa Client

Wróćmy teraz do klasy Client. Jej implementacja pozwoli na wyświetlenie komunikatu od serwera. Zwróćmy uwagę, że dostęp do metody sayHello() jest możliwy dzięki użyciu klasy pośredniczącej. Wywołanie tej zdalnie tej metody jest obarczone ryzykiem niepowodzenia, w związku z tym kompilator automatycznie nas ostrzeże o możliwości wystąpienia wyjątku RemoteException.