Advanced Java Services | Web Services mit JBoss |
Wie jeder Applikationserver so kann auch JBoss einen Web Service anbieten. JBoss kann einen Web Service als ein spezielles Servlet realisieren. Wir übertragen die Beispiele, die die Klasse Endpoint verwenden nun nach JBoss. Interface (SEI) und Implementierung (SIB) sind identisch, der Endpoint wird nun durch JBoss realisiert.
Beim Anlegen eines Dynamc Web Project darf man jetzt nicht beim ersten Dialog sofort auf Finish gehen, sondern muß sich mit Next zweimal weiterklicken bis man auf den Dialog Web Module stößt. Hier muß man dann Generate wb.xml deployment descriptor anhaken. Danach können die Klassen ins Projekt eingebunden werden.
Für unser Projekt kann ein web.xml wie nachfolgend aussehen. Der in der web.xml bei servlet-name eingetragene Name wird nur intern verwendet und wird zum Ansprechen des Service nicht gebraucht.
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>WebServiceServlet</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>BossTimeService</servlet-name> <servlet-class>timeservice.DayTimeServiceImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>BossTimeService</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
Wie verwenden dieselben Klassen wie beim ersten Beispiel zu Endpoint.
Diese drei Dateien (DayTimeService.class und DayTimeServiceImpl.class im Package timeservice und web.xml) werden nun in ein war-File gepackt (z.Bsp. mit Eclipse) und über die Admin-Console von JBoss deployed. Der Name der WAR-Datei ist beliebig, aber unter diesem Namen muß dann der Service angesprochen werden, unsere WAR-Datei heißt MyTimeService.war.
Die WAR-Datei enthält im Verzeichnis classes lediglich das SEI und die SIB. Es sind keine weiteren Bibliotheken notwendig. Will man einen Web Service mit GlassFish deployen müssen dagegen noch eine Reihe von Libraries aufgenommen werden.
Web Application (WAR)s -> Add a new resource
Jetzt wird der Service in der Liste der Services aufgeführt. Man beachte, daß MyTimeService der Kontextname ist. Wir werden ihn noch brauchen. Da wir nur einen Service angemeldet habe, besteht die Liste nur aus einem einzigen Eintrag.
Die zugehörige wsdl-Datei wird unter dem namen der WAR-Datei angesprochen!
Der Java Client ähnelt dem Client zu einem Endpoint. Nur die Service-Url muß angepaßt werden.
import java.net.MalformedURLException; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import javax.xml.ws.WebServiceException; import timeservice.DayTimeService; public class WebService_JBoss_Client { public static void main(String[] args) { System.out.println("JBoss TimeService Javaclient"); try { QName qname = new QName("http://timeservice/", "TheDayTimeService"); // slash am ende notwendig //QName qname = QName(<Packagename>, <serviceName, der in @WebService angegeben wird>) URL serviceURL = new URL("http://localhost:8080/MyDayTimeService?wsdl"); // Name der WAR-Datei Service service = Service.create(serviceURL, qname); DayTimeService ts = service.getPort(DayTimeService.class); System.out.println(ts.getServerTime("ge")); System.out.println("Sekunden seit 1970: " + ts.getUnixTime()); } catch(MalformedURLException ex) { System.out.println(ex); } catch(WebServiceException ex) { System.out.println(ex); } } }
Um zu erkennen, welcher Name an welcher Stelle verwendet wird, haben wir verschiedene Namen verwendet.
Name | Verwendung |
<servlet-name>BossTimeService</servlet-name> | wird von JBoss nur intern verwendet |
@WebService(..., serviceName = "TheDayTimeService") | Der serviceName wird als Parameter localPart im Konstruktor von QName eingesetzt |
MyTimeService.war | Der Name der WAR-Datei (ohne Suffix) wird zum Erstellen der serviceUrl verwendet.
URL serviceURL = new URL("http://localhost:8080/MyDayTimeService?wsdl"). |