# Axis2 Webservice



## Kehoan (16. Dez 2007)

Mein Webservice (Axis2 v 1.3) dient als Middleware zwischen einem SAP -und einem Java-System. Der Datentransfer erfolgt, indem ein SAP-Client eine WSDL-Operation meines Webservices aufruft. Diese WSDL-Operation startet wiederum ein RMI-Client, der Daten vom Server des Java-Systems anfragt. Ist der RMI-Anfrage erfolgreich, werden die Daten über ein Rückgabewert der WSDL-Operation an den SAP-Client zurück gegeben.

Zu der Aufgabenstellung habe ich zwei Probleme:

1. Die Sourcen des RMI-Clients sind im Webservice im aar-Archive eingebunden. Wird der Webservice deployed und ausgeführt, werden diese Sourcen (als Jar-Files) nicht erkannt. Das Problem ist, dass man diese Sourcen im Server (tomcat) im Axis Order unter lib nochmal kopieren muss. Damit hätte ich kein Problem, jedoch kommt es zu Konflikten, da ich für mein RMI-Client zwei Liberies benutze, die im Axis Ordner schon vorhanden sind, jedoch in unterschiedlichen Versionen. Wie bringe ich dazu, dass der tomcat meine Liberies im aar-Archive bentutzt? Das ganze soll irgendwie mit classLoader funktionieren?

2. Kann man eigentlich eine Funktion im Webservice einbauen, der beim Deployment aufgerufen wird, z.b. die main-Funktion? Ich möchte, dass mein RMI-Client nur beim Deployen einmal über eine Funktion gestartet wird.

Bitte um Hilfe!


----------



## Niki (17. Dez 2007)

Ich hatte ähnliches Problem mit axis2 und ClassCastExceptions. Probier mal alle Klassen/jar-Dateien aus dem aar raus zu geben und nur ins WEB-INF/lib zu stellen. Bei mir hat das den Fehler behoben. Anscheinend verwendet axis2 einen eigenen classloader und dadurch dürfte es zu komischen Problemen kommen.
Versteh ich dich richtig das du deine rmi-funktion nur einmal ausführen willst? wenn dem so ist gib sie in einen static block deines web-services. Dann wird sie beim laden der Klasse aufgerufen. Das Ergebnis kannst du in statischen Attributen halten (wenn das so gewünscht ist)


----------



## Kehoan (17. Dez 2007)

Hi Niki, danke für die Info.

genau das habe ich gemacht; alle Jars aus dem aar gelöscht und diese in WEB-Inf/lib kopiert. Jedoch gibt es in diesem Verzeichnis libs (xerxersimpl und xml-apis), die ich auch verwende, jedoch in einer anderen Version und tomcat kann da nicht unterscheiden, welche lib er nehmen soll. Bei Webstart kenne ich, dass die libs in einer jnlp definiert werden können. Gibt es sowas ähnliches für axis?

was meinst du genau mit einem static-Block? - eine static Funktion? Und wird sie beim Deployen einmal aufgerufen?


----------



## Niki (17. Dez 2007)

wenn du Bibliotheken in unterschiedlichen Versionen im tomcat herum kugeln hast wirst du immer wieder in Probleme rein laufen. Du solltest irgendwo die Bibliotheken löschen und einfach im common/lib vom tomcat rein geben. diese bibliotheken werden für alle webapps geladen (soweit ich weiß).

was meinst du mit beim deployen aufrufen? beim deployen wird noch nichts ausgeführt. Wenn du möchtest dass deine rmi funktion nur einmal aufgerufen wird kannst du es soch machen:


```
public class MyWebServiceImpl implements....{

  private static Object rmiReturnValue....

 static{
    try{
      ....Naming.lookup("//host:port/servicename");....

      //hier halt das rmi zeugs
    }catch(Exception ex){
      ex.printStackTrace();
    }
  }

  public Object myServiceMethod(){
    return rmiReturnValue;
  }
}
```

Da wird der rmi-Zugriff nur einmal beim Laden der Klasse aufgerufen.


----------



## Kehoan (17. Dez 2007)

danke, dein Beispiel den RMI-Client in die static-Funktion aufzurufen, hat funktioniert. Nur die doppelten libs bekomme ich noch immer nicht im Griff. Meine ganzen Libs für den RMI-Client (ca. 90 MB) habe ich common/lib kopiert; das hat leider nicht funktioniert. Anscheinend werden diese nicht für alle webapps geladen. Hast du schon mal Erfahrung, die libs in das aar-Archive zu packen; in der Literatur soll das ohne Probleme funktionieren


----------



## Niki (17. Dez 2007)

Ich hab bei meinem axis2-Service alle libs und Klassen rausgehaut und ins WEB-INF/lib von der webapp kopiert. Das aar hab ich dann einfach in WEB-INF/services Verzeichnis entpackt. Also ein Verzeichnis "myservice" unter WEB-INF/services. Darunter befindet sich dann nur das META-INF/services.xml File.


----------



## Willi.Firulais (23. Dez 2007)

Ich habe ähnliche Probleme. Ich versuche (derzeit verzweifelt) ein Axis2 WebService zu erstellen welches mittels JPA/Hibernate auf eine Oracle Datenbank zugreift. Verstehe ich dich richtig:

In die .aar würdes du nur die Web Servcie Definition geben (myservice.aar):

```
jboss/server/deploy/axis2.war/WEB-INF/services/myservice.aar
```

Im myservice.aar ist folgendes enthlten:

```
jboss/server/deploy/axis2.war/WEB-INF/services/myservice.aar/META-INF/MANIFEST.MF
jboss/server/deploy/axis2.war/WEB-INF/services/myservice.aar/META-INF/services.xml
```

In der services.xml definierst Du das POJO welches als Web Service nach aussen zur Verfügung stehen soll.

```
…
<parameter name="ServiceClass" locked="false">company.project.service.CableService</parameter>
…
```

In einer anderen Bibliothek z.B. myservice.war sind die Klassen (z.B. /company/project/service/CableService.class) enthalten. Die Bibiotheken die von dem Service POJO (CableService.class) benötigt warden würdet Ihr unter


```
jboss/server/deploy/myservice.war/WEB-INF/lib/ (.jar von JDBC treibern und hibernate)
```

oder


```
jboss/server/default/lib/ (.jar von JDBC treibern und hibernate)
```

geben?

Jegliche Erfahrungswerte, Verweise und Hilfe willkommen. Vielen Dank für jeglichen Ansatz einer Lösung.


----------



## Kehoan (24. Dez 2007)

das wäre toll, wenn man den webservice in eine war kapseln könnte; dann hätte man auch keine Probleme mit ClassLoaderExceptions. 

Probier doch erstmal den "normalen" Weg, alle Sourcen in .aar zu packen. Tutorials findest du unter:

http://ws.apache.org/axis2/1_3/quickstartguide.html


----------

