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
相关产品推荐
相关产品推荐

