Deserialisieren von SOAPMessages und wieder neu verpacken....

yrkoon

Grünschnabel
Hallo zusammen,

ich habe ein paar WebServices erstellt, welche einen komplexen eigenen Datentyp an den Requestor als Antwort zurücksenden.

Diesen komplexen Datentyp - nennen wir ihn ReturnedData - habe ich als Bean implementiert und kann ihn daher schön einfach über die BeanSerializerFactory und BeanDeserializerFactory deployen.

Nun wollte ich zusätzlich über einen responseFlow und eine eigene Handler-Klasse den zurückgegebenen Datentyp aber in Abhängigkeit des Requestors mal als komplexen und mal als simplen Datentyp (z.B. nur als String, welcher aus dem komplexen Typ erzeugt wird) zurückgeben lassen.

Zur Veranschaulichung:
Code:
HTTP/1.1 200 OK

Content-Type: text/xml;charset=utf-8

Date: Tue, 22 Mar 2005 17:30:50 GMT

Server: Apache-Coyote/1.1

Connection: close



<?xml version="1.0" encoding="UTF-8"?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">
      <soapenv:Body>
         <ns1:getHelloWorldResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://localhost:8082">
            <getHelloWorldReturn href="#id0"/>
         </ns1:getHelloWorldResponse>
         <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:ReturnedData" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://webServiceTester">
            <internalFunctionHandler xsi:type="soapenc:string">0</internalFunctionHandler>
            <returnCode xsi:type="soapenc:string"></returnCode>
            <returnCodeClass xsi:type="soapenc:string">0</returnCodeClass>
            <returnDS xsi:type="soapenc:Array" xsi:null="true" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"/>
            <returnMsg xsi:type="soapenc:string">returnMsg!</returnMsg>
            <returnMsgLong xsi:type="soapenc:string">returnMsgLong!</returnMsgLong>
            <returnResult xsi:type="soapenc:string"></returnResult>
         </multiRef>
      </soapenv:Body>
   </soapenv:Envelope>

ist die Rückgabe des komplexen Datentypes.
Im besagten responseFlow-Handler wollte ich gegebenenfalls nun z.B. den Wert der returnMsg auslesen und Stelle des komplexen ReturnedData nur einen ReturnedString zurückgeben. Und dies ist derzeit mein Problem: Ich versuche den SOAPBody zu deserialisieren und neu aufzubauen. Aber schon beim deserialisieren habe ich meine Probleme. So komme ich zum Beispiel schon gar nicht an die Values der Elemente ran.

Code:
            Message outMsg = msgContext.getResponseMessage();
            SOAPBody sb = outMsg.getSOAPEnvelope().getBody();
            Iterator it = sb.getChildElements();
            String returnValue = "";
            while (it.hasNext()) {
               javax.xml.soap.SOAPElement sbe = (javax.xml.soap.SOAPElement)it.next();
               Iterator it2 = sbe.getChildElements();
               while (it2.hasNext()) {
                   javax.xml.soap.SOAPElement sbee = (javax.xml.soap.SOAPElement)it2.next();
                   returnValue += sbee.getValue();
               }
            }
ist ein (misslungener) Versuch.

Hat jemand einen Tipp?

Danke

yrkoon
 
mmh... ich weiß nicht, ob ich dein problem so recht verstehe...
aber warum stellst du nicht einfach zwei methoden via soap zur verfügung?
eine, die den simplen objekttyp zurückgibt, und eine für den komplexen
returnwert

yves030
 
hallo yves,

du hast natürlich recht. dies wäre die einfache und recht schnell zu implementierende Lösung. Auf der anderen Seite hätte dies den Nachteil, dass ich jeden WebService n mal implementieren müsste, je nachdem welche Anforderung der Requestor an die WebService-Response hat (okay, eigentlich gibt der WebService die Response vor :) , aber Ausnahmen bestätigen die Regel).

D.h. aus meiner Sicht wäre es ein Zeichen von Flexibilität und Komfort, wenn ich eine Methode habe, deren Response ich einfach in Abhängigkeit des Requestors anpasse.

Grüße

yrkoon
 
Zurück