Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

SOAP, AXIS, Deserializer kann Response nicht auswerten

Empfohlene Antworten

Veröffentlicht

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

ups sorry

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

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.