# Axis2: Java Beans senden



## Bartholodeus (25. Juli 2008)

Hallo zusammen,

Standard mäßig kann man über Webservices mit SOAP nur einfache Javatypen verschicken, wie z.B. int, long, byte, String usw.
Es soll allerdings auch möglich sein JavaBeans (sohar als Array) zu verschicken, aber aus der Anleitung auf der Apache Axis Seite, geht das nicht so genau hervor.

Das habe ich bisher gemacht:
Ich habe mir bisher einen Dummy Webservice aufgebaut. Zunächst habe ich mit dem Axis2 Service Archiver den Service generiert und in einem Application Server (hier JBoss) deployed. Danach habe ich mit dem Axis2 Code Generator die WSDL Datei zu der Java Klasse generiert, die als Service dient. Eine der als public deklarierten Methoden gibt als Rückgabetyp ein JavaBean zurück. Mit demselben Tool und der selben WSDL Datei kann man jetzt auch die Client Stubs generieren.

Die Frage ist jetzt: Was muss ich machen, damit der Client dieses Java Objekt (Bean) empfangen kann?
Auf der Apache Axis Homepage steht etwas von
<beanMapping qname="ns:local" xmlns:ns="someNamespace"
languageSpecificType="java:my.java.thingy"/>
hinzufügen, aber nicht in welcher Datei und wo da genau. Muss ich das (wo auch immer) vor, während oder nach der Generierung hinzufügen?

Vielen Dank für eure Hilfe,
Bartho


----------



## desaster0505 (25. Juli 2008)

Wenn du erstmal eine WSDL-Datei hast, dann kann man mit der doch mit WSDL2Java Klassen erzeugen von denen du dann auch das entsprechende Objekt instanzieren kannst. 

Hast du es denn mit probiert mit dem WSDL2Java solche Klassen zu erzeugen?
Vielleicht hilft das weiter.


----------



## takidoso (25. Juli 2008)

hi,
aus dem mittlerweile uralten SOAP von APACHE weiß ich dass man sogenannte Serializer/Deserializer bauen musste für seine eigenen sogenannten Komplexen Datentypen.
vielleicht hilt Dir das Stichwort Serializer weiter beim Googeln
ich habe hier zumindest einen Thread beim googeln gefunden, der vielleicht Dich auf was stoßen lässt.
http://forum.springframework.org/showthread.php?t=19215


viel Glück 

Takidoso


----------



## Oliver Gierke (25. Juli 2008)

Wie wärs mit Spring WebServices? Das unterstützt Marshallingtechnologien wie JAXB und Castor als Implementierungen. Axis2 halte ich ehrlich gesagt für foo, besonders wenn es Cross-Platform-WebServices werden.

Gruß
Ollie


----------



## Bartholodeus (28. Juli 2008)

Da ich schon andere einfache Services auf Axis2 laufen habe, möchte ich nun erst mal dabei bleiben. Für zukünftige  Webservices werde ich aber deinem Ratschlag folgen und mir Alternativen (z.B. Spring) anschauen. Zurück zu meinem Problem:

Tatsächlich habe ich am Anfang Java Code, nämlich den Code der Services. Mit den Axis Tools lasse ich mir hieraus die .wsdl und die .aar Dateien generieren. Die Anleitung dazu habe ich aus folgendem Tutorial:
http://wso2.org/library/1719

Auf der Apache Axis2 Seite kann man zwei Eclipse Plugins runterladen, die dies machen:
Apache Axis2 Service Archive Generator Wizard – Eclipse Plugin
Apache Axis2 Code Generator Wizard - Eclipse Plugin

Das erstere generiert mir aus dem bestehenden Java Code die Service Datei .aar. Der zweite Wizard generiert mir aus dem Java Code meiner Services eine WSDL Datei (Java2wsdl). Direkt im Anschluss kann man aus der WSDL Datei dann die Client Stubs generieren lassen (wsdl2java) (siehe Part 2 des Tutorials).

Die Frage war also: Wenn es in meinem Java Code eine Methode gibt, die eine selbstgeschriebene Java Bean Klasse zurück gibt, was muss ich dann an diesem Prozess ändern? z.B.

public MyJavaBean getBean() {
   return myJavaBean;
}

Das mit dem Bean Mapping stammt hierher, allerdings sehe ich gerade, dass dies für Version 1.2 gilt, ich benutze 1.3, falls das einen Unterschied macht:
http://ws.apache.org/axis/java/user-guide.html#WhatAxisCanNotSendViaSOAP

Wenn ich das so wie in dem Beispiel oben implementiere, erhalte ich immer "null" als Rückgabewert. Ich gehe davon aus, dass der Generator nur WSDL Dateien für die Standardtypen generieren kann und es deshalb nicht funktioniert.
Bei weiteren Recherchen habe ich nun auch gelesen, dass es eher unüblich ist, so vorzugehen wie ich. Normalerweise hat man zunächst die WSDL - Datei und generiert daraus Service und Client Code.
Müßte ich die WSDL - Datei dann von Hand schreiben?

Danke nochmal für eure Hilfe,
Bartho

P.S. Entschuldigt, wenn ich mich in dem ersten Beitrag so undeutlich ausgedrückt habe.


----------



## takidoso (28. Juli 2008)

Oliver Gierke hat gesagt.:


> Wie wärs mit Spring WebServices? Das unterstützt Marshallingtechnologien wie JAXB und Castor als Implementierungen. Axis2 halte ich ehrlich gesagt für foo, besonders wenn es Cross-Platform-WebServices werden.
> 
> Gruß
> Ollie



Hi Ollie,
da habe ich mal eine neugirige Frage, nicht weil ich streiten will, sondern weil ich bisher immer angenommen hatte das SOAP gerade für Cross-Plattform erdacht wurde. Wo liegen die Schwierigkeiten, die Axis bei Cross-Plattform Web-Servicen macht. 
JAXB, da kenne ich nur eine frühe Version von... Gibt es da JAXB compatible Implementationen für andere Sprachen?


----------



## Oliver Gierke (29. Juli 2008)

Wir haben hier zwei WebServices mit Axis2 laufen wo das Gegenüber in .NET implementiert ist. Dabei gibt es vor allem bei komplexen Datentypen oft (De)Serialisierungsprobleme auf beiden Seiten. Das Attachmenthandling von Axis ist ein graus und Art und Umfang der generierten Stubs ist für die meisten Fälle overdose und IMHO ein schlechtes Programmiermodell.

@JAXB - JAXB ist ja nur eine Technologiespezifikation zum Mappen von Objekten auf XML. Soweit ich weiß gibt es auch nur eine Implementierung von Sun selbst. Inwieieit da etwas mit anderen Sprachen kompatibel sein soll, verstehe ich daher nicht so ganz. Such dir einen OX Mapper in der Sprache deiner Wahl und werde glücklich .

REINHAUN!


----------



## port29 (29. Juli 2008)

Oliver Gierke hat gesagt.:


> Wir haben hier zwei WebServices mit Axis2 laufen wo das Gegenüber in .NET implementiert ist. Dabei gibt es vor allem bei komplexen Datentypen oft (De)Serialisierungsprobleme auf beiden Seiten. Das Attachmenthandling von Axis ist ein graus und Art und Umfang der generierten Stubs ist für die meisten Fälle overdose und IMHO ein schlechtes Programmiermodell.



Sorry, wenn ich diesen Thread jetzt einfach so entführe, aber ich möchte eben kurz eine Zwischenfrage stellen:

Hast du es irgendwie schonmal geschafft, ein Objekt vom eigenen Datentyp mit einem Array als eine Eigenschaft zu übertragen? Genau das ist bei mir letztens fehlgeschlagen. Ich habe auch eine Anwendung gebaut, die axis2 als Service Plattform nimmt und .Net ist dann die Desktop Anwendung. Ich habe da versucht ein Bild hochzuladen. Dabei bestand das Bild bei mir aus einem Dateinamen, einem Bildtitel der Bildgröße und noch ein paar anderen IDs und natürlich auch ein Array von bytes - die Bilddaten eben. Wenn das Array = null war, hat alles funktioniert. Aber sobald das Array voll war, gings schief. Und an welcher Stelle es genau gekracht hat, konnte ich auch nicht wirklich erkennen. Ein einfaches Array konnte ich aber problemlos hochschaufeln. Habe deshalb nun einen Umweg genommen. Zunächst wird das Array hochgeschaufelt und in einer Liste auf dem Server gespeichert. Als return wert wird eine ID zurückgegeben, die dann in dem Image Objekt steckt, das dann anschließend hochgeladen wird. Anhand der ID werden dann die Bilddaten aus der Liste gefischt und alles nimmt seinen lauf.


----------

