czwartek, 26 lutego 2009

Niejasności dotyczące web serwisowych deskryptorów

Jakie deskryptory należy utworzyć budując web serwis w Javie? Jasne jest, że pewne elementy znajdują się deskryptorze aplikacji webowej, czyli web.xml, zaś podstawowe informacje na temat portu i klasy implementującej web serwis znajdują się w deskryptorze dodatkowym. Ale jakim? Istnieją bowiem dwa deskryptory dodatkowe: webservices.xml i sun-jaxws.xml.

Nie rozumiem dlaczego istnieją dwa deskryptory web serwisów, więc postanowiłem pogrzebać na ten temat w sieci. Pierwszą rzeczą, jaką zauważyłem, jest to, że deskryptory te chyba nigdy nie występują razem w jednym tekście. Albo web.xml i webservices.xml, albo web.xml i sun-jaxws.xml. Ten drugi występuje prawie wyłącznie w kontekście JAX-WS, co jest oczywiste.

Deskryptor webservices.xml opisany jest w JSR-109 zatytułowanym "Web Services for Java EE". Można tam znaleźć następujące informacje:

1. Pełna nazwa deskryptora: Web Services Deployment Descriptor.
2. Nazwa pliku ściśle określona: webservices.xml.
3. Przeznaczenie: definiuje zestaw web serwisów, które mają zostać rozproszone w kontenerze obsługującym web serwisy Java EE.
4. Użycie: opcjonalne, jeśli stosuje się adnotacje.

Deskryptor sun-jaxws.xml z kolei opisany jest w JAX-WS User Guide, w rozdziale 2.9 zatytułowanym "Deploying Metro endpoint". Można się tam dowiedzieć, że:

1. Pełna nazwa deskryptora: JAX-WS Reference Implementation deployment descriptor.
2. Nazwa pliku ściśle określona: sun-jaxws.xml
3. Przeznaczenie: definiuje atrybuty końcówki web serwisu.
4. Użycie, opcjonalne, jeśli stosuje się adnotacje.

Wynika stąd, że oba deskryptory używane są dokładnie do tego samego celu, przy czym sun-jaxws.xml jest specyficzny dla JAX-WS. Ale po co wprowadzać specyficzny deskryptor, skoro webservices.xml zawiera te same informacje?

Pewną wskazówkę znalazłem w JAX-WS User Guide, gdzie znajduje się następujący fragment:


Before you deploy or publish your endpoint, you will need to package
your endpoint application into a WAR file. The requirements when building a WAR:

* All WSDLs, Schema files should be packaged under WEB-INF/wsdl dir.
It is recommended not to package the WSDL if you are doing
Java-first development.

* WebService implementation class should contain @WebService annotation.
Provider based endpoints should have @WebServiceProvider annotation.

* wsdl, service, port attributes are mandatory for Provider based endpoints
and can be specified in @WebServiceProvider annotation
or deployment descriptor (sun-jaxws.xml).

* Deployment descriptors, web.xml, web services deployment descriptor
(sun-jaxws.xml or 109 or spring)


Interesujące są ostatnie dwa stwierdzenia (szczególnie ostatnie), z których wynika, że różne deskryptory można stosować zamiennie. Ale czy na pewno?

Podstanowiłem to sprawdzić eksperymentalnie. W testowym projekcie usunąłem plik sun-jaxws.xml i dodałem plik webservices.xml. Po uruchomieniu serwera otrzymałem następujący komunikat błędu:

SEVERE: WSSERVLET11: failed to parse runtime descriptor:
javax.xml.ws.WebServiceException:
Runtime descriptor "/WEB-INF/sun-jaxws.xml" is mising


Ostatecznie zagadki nie rozwikłałem.

Brak komentarzy:

Prześlij komentarz