XML per SOAP übermitteln

Frutz

Mitglied
Grüßt Euch,

ich habe eine Dienstekette aufgestellt, die grob zusammengefasst folgendermaßen abläuft:

Es werden 2 Requests an zwei WFS gesendet, die Antwortdateien (GML) werden transformiert und zusammengefasst. Als Ergebnis wird eine GML auf einem Server abgelegt und als Resultat der Kette erhält der Nutzer den Link zu der Datei und kann diese aufrufen.
Zur Übermittlung der Daten nutze ich dabei SOAP.

Das Problem ist nun, dass ich die Datei gern direkt darstellen möchte, ohne den Zwischenschritt über den Link-Aufruf zu gehen.

Das klingt ziemlich einfach, dachte ich zumindest, scheint es aber nicht zu sein, da es dann doch nen Unterschied macht, ob ich nur einen Link oder gleich die Datei zurückgebe.

Ein erster Ansatz war es einfach Mal, während die Datei im Transformationsdienst verarbeitet wird, diese zeilenweise auszugeben und den Ergebnis-String dem Nutzer zu präsentieren.
Für kleine GML-Dateien funktioniert das auch, sieht zwar nicht schön aus, das macht aber erst Mal nichts.

Meine Ergebnisdatei ist aber zwischen 10 und 15 MB groß und dann funktioniert diese Methode nicht bzw. es dauert viel zu lang. War auch nur ein erster Test, ich vermute, dass das nicht der Gedanke von SOAP ist.

Meine Frage lautet also: Wie kann ich die GML direkt im SOAP-Body ausgeben?

Für Tips wäre ich dankbar.
Gruß,
André

EDIT: Achso, ich nutze den Apache Tomcat.
 
Zuletzt bearbeitet:

Frutz

Mitglied
Grüßt Euch,

ich versuch's noch mal etwas präziser.

kurz als Einleitung noch:
Die WSDL zum Web Service erzeuge ich in Eclipse. Mit Hilfe von WSDL2JAVA werden die zugehörigen JAVA-Klassen automatisch generiert. Die Hauptklasse "Skeleton" wird dann mit dem Quellcode zum Dienst gefüllt. Danach die AAR generiert und in den Web-Container von Apache Tomcat kopiert und der Dienst funktioniert.

Bisher wird wie gesagt ein Link zur Datei auf dem Server zurückgegeben:
[XML]return pathnetz+folderfinal+"Gesamt"+time+"."+extension;[/XML]

Das funktioniert auch.

Zusammen mit einem Komillitonen habe ich einen anderen Ansatz versucht, aber wirklich etwas gebracht hat es nicht.

Wir haben in der Skeleton-Klasse als return einfach die (transformierte) Ergebnis XML zurückgegeben.
Diese ist vom Typ Document. In der Klasse zum Dienst sieht das so aus:

Java:
[...]
DocumentSource source = new DocumentSource (doc);
DocumentResult result = new DocumentResult();
transformer.transform(source, result);
                   		
transformedDoc = result.getDocument();
[...]
return transformedDoc;

Da kein String mehr zurückgegeben wurde, mussten natürlich noch die anderen durch WSDL2JAVA generierten Klassen angepasst werden.

Mit Hilfe von Eclipse haben wir als erstes die aufgeworfenen Fehler beseitigt, dazu haben wir den Methoden, die einen String-Werte erwarten/zurückgeben einen Document-Wert zugeordnet, z. B.

Java:
public void setOut(java.lang.String param){
this.localOut=param;

zu

Java:
public void setOut(Document string){
this.localOut=string;

Weiterhin haben wir zwei neue Methoden hinzugefügt (Quellcode dazu aus dem Netz). Ziel war es dabei, dass angelegte Dokument als Ausgabestream zurückzugeben und damit auf dem Browser anzuzeigen.

Java:
public static void copyReaderToWriter(XMLStreamReader reader, XMLStreamWriter writer, boolean fragment) throws XMLStreamException, Exception {
// number of elements read in
int read = 0;
int event = reader.getEventType();
        		  
 while (reader.hasNext()) {
  switch (event) {
   case XMLStreamConstants.START_ELEMENT:
   read++;
   writeStartElement(reader, writer);
    break;
   case XMLStreamConstants.END_ELEMENT:
   writer.writeEndElement();
   read--;
     if (read <= 0 && !fragment) {
     return;
     }
    break;
   case XMLStreamConstants.CHARACTERS:
   writer.writeCharacters(reader.getText());
     break;
   case XMLStreamConstants.START_DOCUMENT:
   case XMLStreamConstants.END_DOCUMENT:
   case XMLStreamConstants.ATTRIBUTE:
   case XMLStreamConstants.NAMESPACE:
     break;
   default:
     break;
   }
   event = reader.next();
}
}

und

Java:
private static void writeStartElement(XMLStreamReader reader, XMLStreamWriter writer)
 throws XMLStreamException {
 String local = reader.getLocalName();
 String uri = reader.getNamespaceURI();
 String prefix = reader.getPrefix();
  if (prefix == null) {
   prefix = "";}}

Aufgerufen wurde das ganze innerhalb der Methode serialize(...), die uns als die Methode zur Ausgabe des Response erschien:

Java:
public void serialize(final javax.xml.namespace.QName parentQName,
          final org.apache.axiom.om.OMFactory factory,
          org.apache.axis2.databinding.utils.writer.MTOMAwareXMLStreamWriter xmlWriter,
          boolean serializeType)
          throws javax.xml.stream.XMLStreamException, org.apache.axis2.databinding.ADBException{
           
          if (localOut==null){
          // write the nil attribute
          throw new org.apache.axis2.databinding.ADBException("out cannot be null!!");
          }else{
        	  try{
             VereinenResponse.copyReaderToWriter(inputFactory.createXMLStreamReader(new org.dom4j.io.DocumentSource((org.dom4j.Document) localOut)), xmlWriter, true);
                                        	  }

[...]

Zugegeben, das ist etwas zusammengeschustert, es schien uns aber eine Möglichkeit, die Ausgabe abzuändern. Vielleicht hat sich jemand mal an etwas ähnlichem versucht und kann hier ne Idee posten.

Vielen Dank und Gruß,
André
 

Keo

Mitglied
Meine Ergebnisdatei ist aber zwischen 10 und 15 MB groß und dann funktioniert diese Methode nicht bzw. es dauert viel zu lang. War auch nur ein erster Test, ich vermute, dass das nicht der Gedanke von SOAP ist.

Meine Frage lautet also: Wie kann ich die GML direkt im SOAP-Body ausgeben?
Bei so großen Datenmengen ist der Transfer via SOAP nicht angebracht. Webservices kommen immer dann ins Spiel, wenn die Kommunikation zwischen Client und Server auf verschiedenen Plattformen standardisiert betrieben werden sollen. Wenn du Client und Server realisieren sollst, wäre eine einfache Socket-Verbindung besser.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Behörden Soap service konsumieren SOA 4
M problem mit großem SOAP Response SOA 3
pkm Struktur einer SOAP-Anwendung SOA 28
N SOAP-Nachrichten verschlüsseln | jax-ws SOA 0
S Soap Request absenden - Anfängerfrage SOA 0
I SOAP Webservice Methoden und Parameter auslesen SOA 3
D [SOAP] wsdl & maven & java 1.8 SOA 6
P SOAP Webservice mit HTTP Basic Authentifizierung SOA 1
E SOAP-Endpunkt per Eclipse-Wizard erstellt, wie nun mit Auth schützen? SOA 2
M Kann man das Protokoll eines REST (Jersey) bzw. SOAP Web Services manipulieren? SOA 5
G SOAP Response "faken" SOA 8
D SOAP Webservice (SAP) SOA 3
K Flex-Ablöse - Was mit den SOAP-Services tun? SOA 5
G Soap, http SOA 3
A Soap with Attachments - Unmarshalling Error SOA 4
K Axis2 SOAP Logging via Client SOA 2
E mit Apache SOAP verschachtelte XML-Tags generieren SOA 2
H SOAP und Synonym-Wortschatz Leipzig SOA 4
V SOAP over JMS - wie funktionierts? SOA 3
C Undefinierte Zeichenketten in SOAP Nachricht SOA 4
E Lesen der kompletten SOAP als WebService Provider/Server SOA 4
R SOAP Nachrichtenaustausch zwischen Axis2-WSs SOA 5
R Webservice aufrufen mit SOAP Style.DOCUMENT ? SOA 5
I SOAP WSDL und UDDI SOA 12
G --> SOAP zwischen Intranet und Internet SOA 3
K Mappen von Objektmethoden bei SOAP SOA 7

Ähnliche Java Themen

Neue Themen


Oben