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