You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSO2 Enterprise Integrator:如何阻止自动添加synapse命名空间到SOAP请求

解决WSO2 PayloadFactory自动添加synapse命名空间的问题

问题原因

WSO2的PayloadFactory在处理未指定命名空间的XML元素时,会默认继承Synapse的默认命名空间http://ws.apache.org/ns/synapse,导致<request>标签被自动添加该命名空间属性,进而引发服务调用异常。

解决方案

1. 显式指定元素的命名空间

直接在PayloadFactory的format部分,给<request>标签显式声明命名空间(根据服务端要求,可指定为空命名空间或服务对应的目标命名空间):

<payloadFactory media-type="xml">
    <format>
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.test.com">
            <soapenv:Header/>
            <soapenv:Body>
                <ws:process>
                    <!-- 显式指定空命名空间,避免自动添加synapse命名空间 -->
                    <request xmlns="">
                        <action>$1</action>
                        <transaction>
                            <id>$2</id>
                        </transaction>
                    </request>
                </ws:process>
            </soapenv:Body>
        </soapenv:Envelope>
    </format>
    <args>
        <arg evaluator="xml" expression="get-property('ACTION')"/>
        <arg evaluator="xml" expression="get-property('TRANSACTION_ID')"/>
    </args>
</payloadFactory>

如果服务端要求<request>属于http://ws.test.com命名空间,可将xmlns值改为该地址。

2. 禁用Axis2的命名空间感知

在PayloadFactory之前添加如下属性配置,关闭Axis2的命名空间自动处理逻辑:

<property name="DISABLE_NS_AWARE" value="true" scope="axis2"/>

该属性会让Axis2在处理XML时不自动添加默认命名空间,适用于不需要严格命名空间校验的场景。

3. 使用Script Mediator构造Payload

绕过PayloadFactory,直接用Script Mediator(如Groovy、JavaScript)手动构建SOAP请求,完全控制XML结构和命名空间:

<property name="ACTION" expression="get-property('ACTION')"/>
<property name="TRANSACTION_ID" expression="get-property('TRANSACTION_ID')"/>
<script language="groovy">
    def action = mc.getProperty("ACTION");
    def txnId = mc.getProperty("TRANSACTION_ID");
    def payload = """
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.test.com">
            <soapenv:Header/>
            <soapenv:Body>
                <ws:process>
                    <request>
                        <action>${action}</action>
                        <transaction>
                            <id>${txnId}</id>
                        </transaction>
                    </request>
                </ws:process>
            </soapenv:Body>
        </soapenv:Envelope>
    """;
    mc.setPayloadXML(payload);
</script>

内容的提问来源于stack exchange,提问作者user666

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:23:32