Aiun Geschrieben 15. November 2007 Geschrieben 15. November 2007 hu, wie in einem anderen Thema im Script/Webserver-Forum beschrieben muss ich größere Datenmengen aus einer SOAP-Schnittstelle abfragen. Da die PHP Version Probleme hat, habe ich einen versuch gestartet das über Java anzusteuern, was wir eh in hinsicht auf Performance testen wollten. Zuerst habe ich einen Client (ohne WSDL) per hand programmiert, basierend auf Apache AXIS 1.4. Eine Abfrage mit leerem ergebnis scheint auch zu funktionieren, aber sobald ein INhalt drin ist (Objekte von eigenen Klassen) gibt es folgenden Fehler: org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something Nach einiger Zeit der suche in Google & Co habe ich wsdl2java ausprobiert. Leider mit dem gleichen Ergebnis. php liefert dank nusoap ja array() - elemente, ist es nicht möglich das in java durch ein generic-Object oder Hashmap-Verzweigungen zu erreichen ? das response an sich ist ok, funktioniert in php ja auch, nur das parsen schafft er nicht. Jemand Infos, Tips, Lösung für mich ? danke Zitieren
Rufus10 Geschrieben 15. November 2007 Geschrieben 15. November 2007 Informationen über die jdk version und die API mit der du die schnittstelle ansprichst wären hilfreich. Kann dir nur sagen, dass du per SOAP nicht einfach Objekte hin & her schicken kannst. In Java 6 wird dies mit Holder Objekten der JAX-WS API gemacht. Dabei brauchst du Serverseitig eine Methode die ein ein Holder<T> Objekt als Parameter übergeben bekommt. Diese könnte z.B. so aussehen: public void listBestellung(Holder<List<Bestellung>> holder) { this.liste.add(new Bestellung ("Hans", "Wurst", "13.55")); holder.value=this.liste; } Nachdem was du geschrieben hast, sollte es ja kein Problem für dich sein, diese Methode ansprechen zu können. Clientseitig würdest du dir jetzt dieses Holder Objekt erzeugen, und die funktion mit dem erzeugten Holder aufrufen. Holder<List<Bestellung>> holder = new Holder<List<Bestellung>>(); webServiceObjekt.listBestellung(holder); for (Bestellung temp : holder.value) { System.out.println(temp.getNachname()); System.out.println(temp.getVorname()); } Nach deinem Funktionsaufruf ist dein Holder also mit den Daten der Servermethode gefüllt. holder.value gibt die Liste der Bestellungen zurück. Die verschachtelten generics können manchmal echt nervig sein. Achja ... was ebenfalls im jdk6 enthalten ist, ist ein kleines Tool namens wsimport. dies generiert die deine Interface klassen automatisch mit allen Annotations. Beispiel: wsimport -d <Pfad der Kompilierten ServiceKlassen> -s <zielverzeichnis für die generierten Klassen> -p <name des Paketes für generierte Klassen> -keep <URL der WSDL> Hoffe das hilft dir irgendwie weiter. Gruß Rufus Zitieren
Aiun Geschrieben 16. November 2007 Autor Geschrieben 16. November 2007 als laufzeitumgebung ist eine JRE 1.5 installiert. Alle benötigten Jars werden bisher über das Manifest der jar angegeben und mit der eigentlichen Programm-Jar im Ordner gespeichert. Alle verwendeten Jars kommen aus Axis 1.4 zur verbindung wird ein org.apache.axis.client.call verwendet und die Rückgabe kommt als object aus call.invoke(); falls die Klasse des Objekts bekannt ist, wird es konviertiert, aber soweit ich es verstehe scheitert es schon beim Parsen des Response innerhalb des Invoke() ich hoffe die Infos sagen dir genug Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.