【发布时间】:2016-07-15 08:53:23
【问题描述】:
我正在 WSO2 ESB 中编写一个代理服务,它接受 JSON 有效负载并执行一些非常复杂的转换(到 SOAP 消息),因此我们正在自定义中介器中编写转换逻辑。
如您所见,我的自定义中介类在消息上下文中设置了一个属性,代理流提取该属性并设置有效负载(使用我可以找到的 Javascript API)。
这导致我的 SOAP 消息被“双重包装”在两个信封标签中,我需要使用带有 XPath 表达式的扩充器来删除外部信封/正文标签。
是否可以在自定义中介中设置 XML 有效负载,从而避免在代理流中读取属性和写入 XML 有效负载?
代理代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<proxy name="stackOverflowProxy" startOnLoad="true" trace="disable"
transports="jms" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<!-- process incoming request in custom class. the payload is a JSON object -->
<class name="stackOverflow.CustomMediator"/>
<!-- set registration xml string as xml payload -->
<script language="js"><![CDATA[mc.setPayloadXML(new XML(mc.getProperty('mediatorPayload')));]]></script>
<enrich>
<source clone="true"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xpath="$body//soapenv:Envelope/soapenv:Body/*"/>
<target type="body"/>
</enrich>
</inSequence>
<outSequence/>
<faultSequence/>
</target>
</proxy>
这是自定义中介类:
package stackOverflow;
// imports ...
public class CustomMediator extends AbstractMediator {
public boolean mediate(MessageContext messageContext) {
//messageContext has a json object property
//message is processed and transformed to a SOAPEnvelope (namespaces omitted for simplicity)
//soapEnvelopeString = <Envelope><Body><tag>value</tag></Body></Envelope>
messageContext.setProperty("mediatorPayload", soapEnvelope.toString());
return true;
}
}
【问题讨论】: