JAX-WS Hello World !

4 04 2012

Potrzebny będzie Eclipse (instalacja), JDK 6 (instalacja), Apache Tomcat 7.0.26 (instalacja), Apache Ant 1.8.3 (instalacja), JAX-WS 2.2.6 (instalacja).

W Eclipse tworzymy nowy Java project o nazwie HelloWorldWS.
W pakiecie (np. com.wordpress.rpodhajny.ws.server) tworzymy klasę HelloWorld.java która będzie bazą dla nowego webserwisu:

package com.wordpress.rpodhajny.ws.server;
import javax.jws.WebService;

@WebService
public class HelloWorld {
    public String sayHelloWorld() {
        return "Hello World !";
    }
}

Anotacja @WebService powoduje, że podczas budowania aplikacji klasa HelloWorld stanie się webservisem opisanym za pomocą standardu WSDL.

Wspomniany proces budowania aplikacji wykonany zostanie za pomocą skryptu ant:

<project name="helloWorldWS" default="generate_compile_war">
    <property name="javac_srcdir" location="src" />
    <property name="javac_destdir" location="classes" />
    <property name="hello_world_ws_class" value="com.wordpress.rpodhajny.ws.server.HelloWorld" />
    <property name="war_file" value="your_apache_tomcat_installation_directory/webapps/helloWorldWS.war" />
    <property name="war_basedir" value="web" />
    <property name="lib_location" location="web/WEB-INF/lib" />

    <target name="generate_ws_files">
        <exec executable="wsgen">
            <arg line="-cp ./bin -keep -s ./src -d ./bin ${hello_world_ws_class}" />
        </exec>
    </target>

    <target name="compile">
        <mkdir dir="${javac_destdir}" />
        <javac srcdir="${javac_srcdir}" compiler="modern" destdir="${javac_destdir}" listfiles="true">
            <include name="**/*.java" />
        </javac>
    </target>

    <target name="war">
        <war destfile="${war_file}" basedir="${war_basedir}">
            <lib dir="${lib_location}" />
            <classes dir="${javac_destdir}" />
        </war>
    </target>

    <target name="generate_compile_war" depends="generate_ws_files, compile, war" />
</project>

Uwaga. Aby program wsgen oraz wsimport (wykorzystany podczas generowania klienta) były możliwe do uruchomienia, zmienna środowiskowa JAVA_HOME musi być przypisana ścieżka do głównego katalogu wykorzystywanego JDK.

Powyższy skrypt umożliwia generowanie i kompilację wszystkich klas webserwisu oraz spakowanie całości do archiwum WAR.

Wszystkie biblioteki Ant są domyślnie wbudowane w Eclipse, tak więc aby uruchomić skrypt który przed chwilą został napisany należy kliknąć na nim prawym klawiszem myszy i wybrać polecenie Run As -> Ant Build …, lub wcisnąć kombinację kalwiszy Shift + Alt + X, a gdy pojawi się menu z dostępnymi pleceniami wcisnąć Q. Trzecim sposobem na uruchamie skryptów Anta jest wykorzystanie jednego z wielu dostępnych w Eclipse widoków (lub jeżeli ktoś woli okien czy paneli). Widok skryptów Ant można dodać klikając lewym klawiszem myszki na ikonę + znajdującą się w lewym dolnym rogu środowiska Eclipse, a następnie Others. W nowym oknie nalezy odszukać widok o nazwie Ant (najłatwiej będzie skorzystać z filtra w górnej części okna). W widoku który zostanie dodany do aktualnie używanej perspektywy klikamy w ikonę mrówki z plusem i wybieramy skrypt Ant który ma zostać dodany do listy. Target z dodanego skryptu uruchamiany jest po dwukrotnym kliknięciu na niego lewym klawiszem myszy.

Uruchamiamy target generate_compile_war aby upewnić się że proces przebiega bezbłędnie. Wyniki działania skryptu pojawią się w konsoli. Komunikat „BUILD SUCCESSFUL” informuje o poprawnym zakończeniu budowania webservisu.

W wyniku działania skryptu w projekcie powstały dwie nowe klasy (F5 na projekcie odświerzy jego zawartość) SayHelloWorld.java oraz SayHelloWorldResponse.java.

Opublikowanie webservisu sprowadza się do umieszczenia WARa w katalogu webapps serwera Apache Tomcat (w tym przypadku wersja 7.0.26) i odczekanie chwili aż wszystko zostanie rozpakowane i uruchomione. Aby sprawdzić czy webservice działa, należy wpisać w przeglądarce internetowej adres http://localhost:8080/helloWorldWS/helloWorld. Na ekranie powinna pokazać się tabela z informacjami na temat webserwisu.

Aby sprawdzić czy webservice rzeczywiście mówi „Hello World !”, trzeba napisać klienta, który będzie się z nim komunikował.
Tworzenie klienta rozpoczynamy od utworzenia nowego Java Project o nazwie HelloWorldWSClient do którego dodajemy plik build.xml, który będzie generował klasy klienta na podstawie wcześniej wspomnianego WSDLa:

<project name="helloWorldWSClient" default="webserviceImport">
    <property name="package_name_for_generated_files" value="com.wordpress.rpodhajny.ws.client" />
    <property name="wsdl_url" value="http://localhost:8080/helloWorldWS/helloWorld?wsdl"/>

    <target name="webserviceImport">
        <exec executable="wsimport">
            <arg line="-keep -s ./src -p ${package_name_for_generated_files} -d ./bin ${wsdl_url}" />
        </exec>
    </target>
</project>

Przed uruchomieniem targetu webserviceImport należy opublikować utworzony wcześniej webserwice. Komunikat „BUILD SUCCESSFUL” informuje o poprawnym zakończeniu generowania klas klienta.

W projekcie, po jego odświerzeniu, powinien pojawić sie pakiet com.wordpress.rpodhajny.ws.client wraz zawartością:

  • HelloWorld.java
  • HelloWorldService.java
  • OjectFactory.java
  • package-info.java
  • SayHelloWorld.java
  • SayHelloWorldResponse.java

Powyższy zestaw klas posłuży do komunikacji z helloWorldWS. Aby tego dokonać tworzymy nową klasę:

package com.wordpress.rpodhajny.ws.client;
public class HelloWorldWSClient {
    public static void main(String[] args) {
        HelloWorldService helloWorldService = new HelloWorldService();
        HelloWorld helloWorld = helloWorldService.getHelloWorldPort();
        String message = helloWorld.sayHelloWorld();
        System.out.println(message);
    }
}

Klasa HelloWorldService służy do nawiązania połączenia z webserwisem. Udostępnia ona również interfejs wygenerowany dla napisanej na początku tego tutoriala klasy HelloWorld. Dzięki temu wiemy jakie metody są dostępne do wykorzystania po stronie klienta. Uruchamiając powyższy kod na ekranie konsoli powininiśmy zobaczyć napis: „Hello World !”.