Advanced   Java   Services Web Services mit JBoss Back Next Up Home


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.


web.xml

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>

Service Endpoint Interface und Service Implementation Bean

Wie verwenden dieselben Klassen wie beim ersten Beispiel zu Endpoint.


Erstellen der WAR-Datei

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.


Deployen in JBoss
Web Application (WAR)s -> Add a new resource

jboss-webservice-1.ipg

jboss-webservice-2.ipg

jboss-webservice-3.ipg


Übersicht über die Services unter /jbossws/services

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.

jboss-webservice-4.ipg


Die zugehörige wsdl-Datei

Die zugehörige wsdl-Datei wird unter dem namen der WAR-Datei angesprochen!

jboss-webservice-5.ipg


Der Java Client

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);
      }
   }
}

Welcher Name wird wo verwendet

Um zu erkennen, welcher Name an welcher Stelle verwendet wird, haben wir verschiedene Namen verwendet.




NameVerwendung
<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.warDer Name der WAR-Datei (ohne Suffix) wird zum Erstellen der serviceUrl verwendet.
URL serviceURL = new URL("http://localhost:8080/MyDayTimeService?wsdl").

Valid XHTML 1.0 Strict top Back Next Up Home