Domino 9 und frühere Versionen > ND8: Entwicklung

Domino Webservice-Consumer: Umgang mit 'choice' und 'sequence' Elementen

(1/1)

m3:
Hallo liebe Leute.

Folgendes Problem. Ich habe in einem WSDL folgenden Abschnitt:

--- Code: --- <xs:element name="RetrieveDocumentsResponse">
<xs:complexType>
<xs:choice>
<xs:element name="Success">
<xs:complexType>
<xs:sequence>
<xs:element ref="das:Document" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Error" type="das:Error"/>
</xs:choice>
</xs:complexType>
</xs:element>
--- Ende Code ---

Woraus mir der Domino-WSDL-Importer (8.5.1) folgenden Lotusscript-Code baut:

--- Code: ---Class RetrieveDocumentsResponse_n0 As XSD_ANYTYPE

Public Success As RetrieveDocumentsResponse_Success_n0
Public Error As Error_n0

Sub New
End Sub

End Class
--- Ende Code ---

Die Kollegen, welche die Antwort verarbeiten müssen, mokieren sich nun zurecht darüber, dass ich immer auch ein leeres Error-Element mitschicke.

--- Code: ---      <ns0:RetrieveDocumentsResponse xmlns:ns0="uri:xxx.at/DAS/v1.0#">
       <ns0:Success>
            <ns0:Document>
               <ns0:Element1>.....

            </ns0:Document>
         </ns0:Success>
         <ns0:Error/>
      </ns0:RetrieveDocumentsResponse>

--- Ende Code ---


Um das zu Beheben, habe ich die Doku nochmal durchgeackert und bin auf folgendes "Gem" gestoßen:


--- Zitat ---Unsupported constructs
For this release, the following WSDL or XML Schema constructs have limited or no supported mappings to LotusScript or Java, and are rejected (or ignored, if indicated) by the Designer “Import WSDL” feature:
+) choice element, if nested, optional, or maxOccurs > 1 (arrays)
+) sequence element, if  maxOccurs > 1 (arrays)
--- Ende Zitat ---

Das kann es doch bitte nicht sein, oder?

Hat wer eine Idee, wie ich das "korrekt" abfackeln könnte?

gossifu:
Die Frage ist, was möchtest Du erreichen? Da Du im choice Tag beide Elemente (Success, Error) hast, werden Dir auch diese umgesetzt.
Und muss man in dem ComplexType einen anderen verschachteln?

mfg

Kjeld

m3:
Ja, aber choice bedeutet - so zumindest unsere Tibco-Leute - dass NUR ein Success ODER ein Error Element zurück kommt, nicht beides.
Und das bekomm ich einfach nicht hin.

gossifu:
Ich baue mir für solche sachen immer eine Fault-Element und die Messages dafür


--- Code: ---            <complexType name="FaultElement">
                <sequence>
                    <element name="faultContent" type="impl:FaultType"/>
                </sequence>
            </complexType>
            <complexType name="FaultType">
                <xsd:annotation>
                    <xsd:documentation>Fehlermeldung.</xsd:documentation>
                </xsd:annotation>
                <sequence>
                    <element name="code" type="xsd:string"/>
                </sequence>
            </complexType>

--- Ende Code ---

Das binde ich dann in Elemente ein. Für jede Function ein eigenes Fault-Element


--- Code: ---<element name="getFunctionNameFault" type="impl:FaultElement" />

--- Ende Code ---

Das wiederum in den messages

--- Code: ---<wsdl:message name="getFunctionName_faultMsg">
        <wsdl:documentation>Fehler Status</wsdl:documentation>
        <wsdl:part name="fault"/>
</wsdl:message>

--- Ende Code ---

Dass wiederum in den PortTypes

--- Code: ---<wsdl:portType name="WebServiceName">
        <wsdl:operation name="getFunctionName">
            <wsdl:documentation>Was macht diese Funktion</wsdl:documentation>
            <wsdl:input message="impl:getFunctionNameRequest"/>
            <wsdl:output message="impl:getFunctionNameResponse"/>
            <wsdl:fault name="fault" message="impl:getFunctionName_faultMsg"/>
        </wsdl:operation>
</wsdl:portType>

--- Ende Code ---

Somit habe ich ein Errorhandling in jeder meiner Funktionen. Und generiert wird mir:


--- Code: ---Function getFunctionName(parameters As GetFunctionRequest, Fault1 As FaultElement) As GetFunctionResponse
     On Error GoTo FaultElement
        ...
FaultElement:
Call Fault1.setFault(True)
Call Fault1.setFaultString("getFunctionName fault")
End Function

--- Ende Code ---

Und wenn meine Function fehlschlägt, bekommt der WebServiceClient die von mir im Fault1.setFaultString festgelegt Meldung.

Ich hoffe wir reden nicht aneinander vorbei.

mfg

Kjeld

m3:
Kjeld, ja das wäre die Idee, wenn ich das machen würde.
Das WSDL/XSD wird aber von unseren "Architekten" erstellt ...  :-X

Ich hab dazu mittlerweile auch schon einen PMR aufgemacht, und den Hinweis auf die Technote #1318039 "Imported WSDL <choice> tag serializes invalid SOAP data." bekommen. Hab ich natürlich gleich ausprobiert, die hilft aber in meinem Fall nicht, da wir in dem choice complextype drinnen haben und keine Strings. :(

Aber mal schaun, was die Jungs in Irland zusammenbringen, beim 2nd Level bin ich schon. :)

Der erwähnte "SPR# JGRN79MHVM" ist übrigens im (no na ned) "not enough customer interest" Status. Is ja eh wurscht, dass man den Standarts nicht enspricht, braucht ja kein Customer.  >:D

Navigation

[0] Themen-Index

Zur normalen Ansicht wechseln