如何在调用端点之前有条件地将标签插入 soap 请求体?

How to insert tag conditionally into soap request body before calling endpoint?

我想根据某些条件向 soap 请求正文添加标签

应该添加到ActionProperties标签下

所以我尝试使用 enrich mediator 如下:

<filter regex="false" source="get-property('IsValid')">
    <then>
    <enrich>
      <source clone="true" type="inline">
         <p857:Property propertyId="isArchived" settable="0" xsi:type="p857:SingletonString" 
           xmlns:p857="http://www.filenet.com/ns/fnce/2006/11/ws/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <p857:Value>1</p857:Value>
           </p857:Property>
      </source>
      <target 
      xmlns:p857="http://www.filenet.com/ns/fnce/2006/11/ws/schema" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      action="child" 
      type="custom" xpath="//p857:ExecuteChangesRequest/p857:ChangeRequest/p857:ActionProperties" />
   </enrich>
   </then>
        <else/>
   </filter>
    
    
    <payloadFactory media-type="xml">
        <format>
            <soapenv:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
            xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <soapenv:Header>
                    <Security xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext">
                        <hd:UsernameToken xmlns:hd="http://schemas.xmlsoap.org/ws/2002/12/secext">
                            <hd:Username></hd:Username>
                            <hd:Password></hd:Password>
                        </hd:UsernameToken>
                    </Security>
                </soapenv:Header>
                <soapenv:Body>
                    <p857:ExecuteChangesRequest refresh="1" xmlns:p857="http://www.filenet.com/ns/fnce/2006/11/ws/schema">
                        <p857:ChangeRequest id="1" updateSequenceNumber="0">
                            <p857:TargetSpecification classId="ObjectStore" objectId="" serializationDuplicate="0"/>
                            <p857:Action autoUniqueContainmentName="1" classId="" defineSecurityParentage="0" xsi:type="p857:CreateAction"/>
                            <p857:Action autoClassify="0" checkinMinorVersion="0" xsi:type="p857:CheckinAction"/>
                            <p857:ActionProperties>

                                <p857:Property propertyId="DocumentTitle" settable="0" xsi:type="p857:SingletonString">
                                    <p857:Value></p857:Value>
                                </p857:Property>
                                <p857:Property propertyId="ContentElements" settable="0" xsi:type="p857:ListOfObject">
                                    <p857:Value accessAllowed="0" classId="ContentTransfer" dependentAction="Insert" newIndex="0" originalIndex="0" serializationDuplicate="0" updateSequenceNumber="0">
                                        <p857:Property propertyId="ContentType" settable="0" xsi:type="p857:SingletonString">
                                            <p857:Value></p857:Value>
                                        </p857:Property>
                                        <p857:Property propertyId="RetrievalName" settable="0" xsi:type="p857:SingletonString">
                                            <p857:Value></p857:Value>
                                        </p857:Property>
                                        <p857:Property propertyId="Content" settable="0" xsi:type="p857:ContentData">
                                            <p857:Value xsi:type="p857:InlineContent">
                                                <p857:Binary></p857:Binary>
                                            </p857:Value>
                                        </p857:Property>
                                    </p857:Value>
                                </p857:Property>
                            </p857:ActionProperties>
                            <p857:RefreshFilter levelDependents="0" maxElements="0" maxRecursion="0">
                                <p857:ExcludeProperties>DateCreated</p857:ExcludeProperties>
                                <p857:ExcludeProperties>DateLastModified</p857:ExcludeProperties>
                            </p857:RefreshFilter>
                        </p857:ChangeRequest>
                    </p857:ExecuteChangesRequest>
                </soapenv:Body>
            </soapenv:Envelope>
        </format>
        <args>
            <arg evaluator="xml" expression="get-property('Username')"/>
            <arg evaluator="xml" expression="get-property('Password')"/>
            <arg evaluator="xml" expression="get-property('ObjectStore')"/>
            <arg evaluator="xml" expression="get-property('DocumentClass')"/>
            <arg evaluator="xml" expression="get-property('FileName')"/>
            <arg evaluator="xml" expression="get-property('FileData')"/>
            <arg evaluator="xml" expression="get-property('ContentType')"/>
        </args>
    </payloadFactory>

但我总是收到错误消息:要丰富的目标对象无效

我能够通过在 payloadFactory 标签 之后添加 enrich 标签 来修复:

<enrich>
        <source clone="true" type="inline">
            <p857:Property propertyId="isArchived" settable="0" 
            xmlns:p857="http://www.filenet.com/ns/fnce/2006/11/ws/schema" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="p857:SingletonString">
                <p857:Value>1</p857:Value>
            </p857:Property>
        </source>
        <target action="child" xmlns:p857="http://www.filenet.com/ns/fnce/2006/11/ws/schema" 
        xpath="//p857:ExecuteChangesRequest/p857:ChangeRequest/p857:ActionProperties"/>
    </enrich>