
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
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
.
1 2 3 4 5 6 7 8 9 10 |
package pl.programistajava; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface WS { @WebMethod public String sayHello(); } |
Następnie utworzymy klasę, która będzie węzłem końcowym w naszym web service. Klata ta implementuje interfejs WS
.
1 2 3 4 5 6 7 8 9 10 11 12 |
package pl.programistajava.srvr; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public class Usluga { @WebMethod public String sayHello() { return "Oto Twój pierwszy webservice JAX-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
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
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
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
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
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
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
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package pl.programistajava.clnt; import java.rmi.RemoteException; public class Client { public static void main(String [] args) { //Utworzenie instancji klasy pośredniczącej pl.programistajava.srvr.UslugaProxy usluga = new pl.programistajava.srvr.UslugaProxy(); try { //Zdalne wywołanie publicznej metody serwera System.out.println(usluga.sayHello()); } catch (RemoteException e) { e.printStackTrace(); } } } |