Nachdem im ersten Teil der Tomcat Server zum Laufen gebracht wurde, geht es hier darum, Axis2 auf dem Tomcat Server zu installieren.
Apache Axis2™ ist eine Web Services/SOAP/WSDL Engine, die es auf relative einfache Weise erlaubt Webservices bereitzustellen. Eine Möglichkeit besteht darin sog. POJOs (Plain Old Java Objects), also mehr oder weniger einfache Java-Klassen zu definieren und diese mit Axis2 in einen Web-Service zu „transformieren“. Eine genauere Beschreibung ist hier zu finden.
Man kann Axis2 als Standalone Server, oder auf einem Servlet Container (z.B. Tomcat) bzw. einem vollständigen JEE Server (Applikationsserver wie JBoss etc.) betreiben.
Installation (Tomcat)
1) Download und Entpacken von http://axis.apache.org/axis2/java/core/download.cgi
2) Im entpackten Verzeichnis nach „webapp“ wechseln
3) Zusammenbauen der WAR Datei:
/opt/axis2-1.6.1/webapp$ ant
Buildfile: /opt/axis2-1.6.1/webapp/build.xml
init:
...
prepare.repo:
...
create.war:
[war] Building war: /opt/axis2-1.6.1/dist/axis2.war
[delete] Deleting directory /opt/axis2-1.6.1/dist/temp
BUILD SUCCESSFUL
Total time: 3 seconds
4) Kopieren der WAR Datei in das Verzeichnis „webapps“ des Servlet-Containers:
/opt/apache-tomcat-6.0.35$ sudo cp /opt/axis2-1.6.1/dist/axis2.war ./webapps/
5) Durch das Kopieren in den „webapps“ Folder, wird die Datei (bei laufendem Tomcat) automatisch deployed. Man kann das, nach kurzer Zeit, im Log File (/opt/apache-tomcat-6.0.35/logs$ sudo tail -50 catalina.out), in der Manager Applikation (http://localhost:8080/manager/html) und durch Aufrufen der URL (localhost:8080/axis2) sehen.
Bei Problemen kann im Log File bzw. im Manager überprüft werden, ob die Web-Applikation auch gestartet wurde!
Axis2 Admin Konsole
Für Axis2 gibt es eine Admin-Konsole mit dem Default-Account „admin“/“axis2“ unter http://localhost:8080/axis2/axis2-admin/login.
Sie können den Benutzernamen und das Kennwort in der Datei „axis2.xml“ nach Bedarf ändern.
WebServices erstellen:
Axis2 bietet mehrere Möglichkeiten WebServices zu erstellen:
– über JAX-WS, siehe auch Apache Axis2 – JAX-WS Guide
– über sog. POJOs, siehe auch POJO Web Services using Apache Axis2
– aus einem vorhandenen WSDL Dokument
– etc.
Im Folgenden beziehe ich mich auf die Nutzung sog. POJOs.
Axis2 WebService mit POJOs
Mit Axis2 kann man durch eine sog. Service-Klasse einen WebService in Java programmieren. Zudem ist es möglich über diesen WebService JavaBeans anzusprechen (nicht mit EJBs – Enterprise Java Beans zu verwechseln). Die Verwendung von JavaBeans ermöglicht eine Modularisierung des Web-Applikation.
Service Klasse und services.xml
Die Erstellung eines Axis2 WebServices mit POJOs (ohne JavaBeans) lässt sich relativ schnell erledigen. Sie erstellen eine Service-Klasse, in einem beliebigen Projekt-Verzeichnis und anschließend eine services.xml Datei.
Service-Klasse:
package sample;
public class SampleService {
public String echo(String value) {
return value;
}
public int add(int a, int b) {
return a + b;
}
public void update(int c) {
}
}
services.xml Datei:
<service name="SampleService">
<description>This is my Sample Service</description>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass">sample.SampleService</parameter>
</service>
Verwendung von Eclipse als IDE
Ich habe in Eclipse ein Projekt „SampleService“ angelegt und die Klasse „SampleService“ im Paket „sample“ unter „src“ angelegt. Außerdem habe in „src“ ein Verzeichnis „META-INF“ erstellt und darin die Datei „services.xml“ abgelegt:
Anschließend habe ich die Datei „build.xml“ aus „Axis2_HOME/samples/pojoguide“ in das Projektverzeichnis kopiert und angepasst: build.xml
Führt man nun build.xml mit ant aus, wird eine aar Datei (Tomcat Webservice Paket) erstellt, die man nun auf Axis2 im Tomcat deployen kann.
Deployment
Wie bringt man nun den Service auf den Tomcat Server?
- Rufen Sie die URL für den Tomcat Server auf, z.B.: http://localhost:8080/
- Selektieren Sie Administration > Tomcat Manager
- Selektieren Sie unter „Application“ den Pfad „/axis2“
- Selektieren Sie den Link „Administration“
- Geben Sie Username und Passwort ein (Default: admin/axis2) und drücken Sie den „Login“ Knopf
- Wählen Sie den Link: Tools > Upload Service
- Wählen Sie „Durchsuchen“ und selektieren Sie das aar File
- Drücken Sie den „Upload“ Knopf
- Wenn alles glatt gelaufen ist, sehen Sie unter „System Components“ > „Available Services“ den Service „“. (Hinweis: Es kann sein, dass Sie einen Augenblick warten müssen und die Anzeige refreshen müssen, bis der Service sichtbar ist).
Die WSDL des WebServices lautet: „http://localhost:8080/axis2/services/SampleService?wsdl“.
Testen des WebServices mit SOAP UI
SoapUI ist ein hervorragendes, freies Tool zum Testen von WebServices, sofern man die WSDL zur Verfügung hat. Die Installation geht einfach und schnell von statten. Man legt nach der Installation ein neues Projekt an und wählt die URL der WSDL (http://localhost:8080/axis2/services/SampleService?wsdl). Anschließend kann man die verschiedenen Operationen des WebServices testen. Alternativ kann man sich auch einen sog, RPCClient programmieren und damit den WebService testen (s.u.).
Testen des WebServices mit einem RPC Client
Alternativ zu SoapUI kann man einen sog. RPC Client programmieren und die Funktionalität des WebServices testen (siehe hierzu: Testing the POJO Web Service Using RPCServiceClient).
Erstellen Sie hierzu in Eclipse eine Java-Klasse „SampleServiceRPCClient“ im Paket „sample.rpcclient“:
package sample.rpcclient;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class SampleServiceRPCClient {
public static void main(String[] args1) throws AxisFault {
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/axis2/services/SampleService");
options.setTo(targetEPR);
// Setting the add Operation
QName opEcho =
new QName("http://sample", "echo");
// Setting the parameters for the Operation:
Object[] opSetSampleServiceArgs = new Object[] { "jkhofmann" };
Class[] returnTypes = new Class[] { String.class };
Object[] response = serviceClient.invokeBlocking(opEcho,
opSetSampleServiceArgs, returnTypes);
String result = (String) response[0];
if (result == null) {
System.out.println("SampleService didn't initialize!");
return;
}
// Displaying the result
System.out.println("Echo : " + result);
}
}
Beachten Sie, dass in diesem Beispiel keine JavaBean als Business-Klasse verwendet wird, vielmehr wird der Service direkt angesprochen. Um eine JavaBean als Business-Klasse dazwischenzuschalten, verfolgen Sie bitte den Artikel „POJO Web Services using Apache Axis2“.
Hinweis: Die Fehlermeldungen in der Eclipse IDE können Sie ignorieren, es handelt sich dabei um fehlende Einträge im Build-Path. Diese werden über das Target „rpc.client.run“ in build.xml automatisch geladen. Wenn Sie also den Client testen wollen, verwenden Sie die Eclipse IDE oder ant mit dem Target „rpc.client.run“, oder ziehen Sie die fehlenden Libraries aus Axis2 in den Build-Path des Eclipse-Projektes.
Das Ergebnis über Eclipse/build.xml mit dem Target „rpc.client.run“ sollte wie folgt aussehen:
rpc.client.run:
[java] log4j:WARN No appenders could be found for logger (org.apache.axis2.context.AbstractContext).
[java] log4j:WARN Please initialize the log4j system properly.
[java] Echo : jkhofmann
BUILD SUCCESSFUL
Total time: 4 seconds
Testen des WebServices mit WSDL2Java.sh
Axis2 liefert ein Skript mit, welches die komfortable Erstellung von Services und Clients erlaubt. Es nennt sich „wsdl2java.sh“ und ist im „bin“ Verzeichnis der Axis2-Installation zu findet. Hierzu muss lediglich die WSDL vorhanden sein, über die WSDL-URI kann man sich mit diesem Skript die Client-Anteile generieren lassen.
Die Clients können auf verschiedene Arten generiert werden. Mit der Option „-d“ kann man festlegen, wie die XML-Struktur des Services in Java-Objekte umgesetzt wird – Databinding. Läßt man die Option weg, werden XML-in-out Stubs generiert, ohne Databinding.
Verwendet man Databinding, kann man zwischen folgenden Optionen wählen:
- Axis2 Databinding Framework (ADB): einfach, aber gewisse Einschränkungen bei XML Schemas
- XMLBeans: voller Schema-Kompiler, aber etwas komplizierter als ADB
- JiBX: JiBXist ein komplettes Databinding-Framework
siehe hierzu auch: „Choosing a Client Generation Method„.
Neben der Option für das Databindung (-d) kann man mit „-s“ synchrone bzw. blockierende Clients erzeugen lassen, also Clients die beinem Request auf den Response warten. Eine weitere nützliche Option ist „-p“, mit ihr kann man den Namespace (Package-Pfad) des Clients festlegen. Zu guter Letzt finde ich die Option „-o“ noch nützlich, da man mit ihr ein Zielverzeichnis für den generierten Code festlegen kann.
Im folgenden will ich beispielhaft veranschaulichen, wie man einen Client, ganz ohne Databinding, generiert und ausprogrammiert.
- Erstellen eines temporären Verzeichnisses und wechseln in das Verzeichnis
- Generieren des Client-Stubs:
/opt/axis2-1.6.1/bin/wsdl2java.sh -uri http://localhost:8080/axis2/services/SampleService?wsdl -p
sample.wsdl2java.client -s
Das Ergebnis:
juergen@vostrou64:~/loeschen$ ls -lR
.:
insgesamt 12
-rw-rw-r-- 1 juergen juergen 5151 2011-12-29 03:23 build.xml
drwxrwxr-x 3 juergen juergen 4096 2011-12-29 03:23 src
...
./src/sample/wsdl2java/client:
-rw-rw-r-- 1 juergen juergen 132306 2011-12-29 03:23 SampleServiceStub.java
- Projekt in Eclipse anlegen bzw. ergänzen um die Klasse
sample.wsdl2java.client.SampleServiceStub
- Inhalt der Klasse vom temporären Verzeichnis in Eclipse kopieren
- Build-Path von Eclipse anpassen. Es müssen die entsprechenden JARs aus der Axis2 Installation im lib Verzeichnis hinzugefügt werden.
- Client erstellen:
package sample.wsdl2java.client;
import sample.wsdl2java.client.SampleServiceStub.*;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
try {
SampleServiceStub stub =
new SampleServiceStub
("http://localhost:8080/axis2/services/SampleService");
// Aufruf der Services:
echo(stub);
add(stub);
} catch(Exception e) {
e.printStackTrace();
System.out.println("nnn");
}
}
/* Echo Service */
public static void echo(SampleServiceStub stub){
try{
Echo req = new Echo();
req.setArgs0("Hello World");
EchoResponse resp = stub.echo(req);
String response = resp.get_return();
System.out.println("Response = " + response);
} catch(Exception e){
e.printStackTrace();
System.out.println("nnn");
}
}
/* Add Service */
public static void add(SampleServiceStub stub){
try{
Add req = new Add();
req.setArgs0(1);
req.setArgs1(2);
AddResponse resp = stub.add(req);
int response = resp.get_return();
System.out.println("Response = " + response);
} catch(Exception e){
e.printStackTrace();
System.out.println("nnn");
}
}
}
- Kompilieren und testen.
Gefällt mir Wird geladen …