0

Part of my WSDL is defined as

<s:complexType name="AbstractOperation" abstract="true">
    <s:sequence>
        <s:element minOccurs="1" maxOccurs="1" name="progressive" type="s:int" />
    </s:sequence>
</s:complexType>

<s:complexType name="ConcreteOperation1">
    <s:complexContent mixed="false">
        <s:extension base="tns:AbstractOperation">
            <s:sequence>
                <s:element minOccurs="0" maxOccurs="1" name="identifier" type="s:string" />
            </s:sequence>
        </s:extension>
    </s:complexContent>
</s:complexType>

<s:complexType name="ConcreteOperation2">
    <s:complexContent mixed="false">
        <s:extension base="tns:AbstractOperation">
            <s:sequence>
                <s:element minOccurs="0" maxOccurs="1" name="code" type="s:string" />
            </s:sequence>
        </s:extension>
    </s:complexContent>
</s:complexType>

I want to return something like:

<tns:Operations>
    <tns:AbstractOperation xsi:type="tns:ConcreteOperation1">
        <tns:progressive>1</tns:progressive>
        <tns:identifier>FP301DW</tns:identifier>
    </tns:AbstractOperation>
    <tns:AbstractOperation xsi:type="tns:ConcreteOperation2">
        <tns:progressive>2</tns:progressive>
        <tns:code>AF2F3S</tns:code>
    </tns:AbstractOperation>
</tns:Operations>

In my NestJS project, I am using the soap library to start a SOAP server. In the controller, after retrieving data from a Prisma ORM instance, I am returning it like this:

     return {
        Operations: {
          AbstractOperation: prismaMappedOperationArray,
        },
      }

But I get:

<tns:Operations>
    <tns:AbstractOperation>
        <tns:progressive>1</tns:progressive>
        <tns:identifier>FP301DW</tns:identifier>
    </tns:AbstractOperation>
    <tns:AbstractOperation>
        <tns:progressive>2</tns:progressive>
        <tns:code>AF2F3S</tns:code>
    </tns:AbstractOperation>
</tns:Operations>

How can I dynamically specify the xsi:type attribute when arranging the response, based on the instance of the prismaMappedOperationArray objects (which can be of either the ConcreteOperation1 or ConcreteOperation2 class)?

0

1 Answer 1

0

Ok I answered myself after some radom testing session, soap library documentation do not mention it but if you wanna add marshallable attributes to your Typescript object you have to add an attributes key like:

return {
  Operations: {
    AbstractOperation: prismaMappedOperationArray,

    attributes: { 'xmlns:xsi': 'tns:ConcreteOperation1' },
   },
}

And this will return:

<tns:Operations>
    <tns:AbstractOperation xsi:type="tns:ConcreteOperation1">
        <tns:progressive>1</tns:progressive>
        <tns:identifier>FP301DW</tns:identifier>
    </tns:AbstractOperation>
    <tns:AbstractOperation xsi:type="tns:ConcreteOperation1">
        <tns:progressive>2</tns:progressive>
        <tns:identifier>FP301DW</tns:identifier>
    </tns:AbstractOperation>
</tns:Operations>
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.