Wso2 在自定义中介中设置SOAP信封负载

Wso2 在自定义中介中设置SOAP信封负载,wso2,wso2esb,Wso2,Wso2esb,我正在WSO2 ESB中编写一个代理服务,它接受JSON负载并执行一些非常复杂的转换(到SOAP消息),因此我们在自定义中介中编写转换逻辑 如您所见,我的自定义中介类在消息上下文中设置了一个属性,代理流提取该属性并设置有效负载(使用我可以找到的Javascript API) 这导致我的SOAP消息被“双重包装”在两个信封标记中,我需要使用带有XPath表达式的enricher来删除外层信封/正文标记 是否可以在自定义中介中设置XML负载,从而避免读取属性并在代理流中写入XML负载? 代理代码如下

我正在WSO2 ESB中编写一个代理服务,它接受JSON负载并执行一些非常复杂的转换(到SOAP消息),因此我们在自定义中介中编写转换逻辑

如您所见,我的自定义中介类在消息上下文中设置了一个属性,代理流提取该属性并设置有效负载(使用我可以找到的Javascript API)

这导致我的SOAP消息被“双重包装”在两个信封标记中,我需要使用带有XPath表达式的enricher来删除外层信封/正文标记

是否可以在自定义中介中设置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;
    }
}
包堆栈溢出;
//进口。。。
公共类CustomMediator扩展了AbstractMediator{
公共布尔中介(MessageContext MessageContext){
//messageContext具有json对象属性
//消息被处理并转换为SOAPEnvelope(为了简单起见,省略了名称空间)
//SOAPEnvelopeRestring=值
messageContext.setProperty(“mediatorPayload”,soapEnvelope.toString());
返回true;
}
}

在自定义中介中,您将整个soap消息设置为属性,在脚本中介中,您将其设置为soap消息的有效负载。这就是为什么你会得到双重肥皂环境

在您的类中,mediator只将body payload设置为property,然后使用脚本将该值作为payload插入到主流中,这将解决您的问题

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)
    //**soapPayload = <tag>value</tag>** 
    messageContext.setProperty("mediatorPayload", soapPayload);     
        return true;
    }
}
包堆栈溢出;
//进口。。。
公共类CustomMediator扩展了AbstractMediator{
公共布尔中介(MessageContext MessageContext){
//messageContext具有json对象属性
//消息被处理并转换为SOAPEnvelope(为了简单起见,省略了名称空间)
//**soapPayload=值**
setProperty(“mediatorPayload”,soapPayload);
返回true;
}
}

在自定义中介中,您将整个soap消息设置为属性,在脚本中介中,您将其设置为soap消息的有效负载。这就是为什么你会得到双重肥皂环境

在您的类中,mediator只将body payload设置为property,然后使用脚本将该值作为payload插入到主流中,这将解决您的问题

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)
    //**soapPayload = <tag>value</tag>** 
    messageContext.setProperty("mediatorPayload", soapPayload);     
        return true;
    }
}
包堆栈溢出;
//进口。。。
公共类CustomMediator扩展了AbstractMediator{
公共布尔中介(MessageContext MessageContext){
//messageContext具有json对象属性
//消息被处理并转换为SOAPEnvelope(为了简单起见,省略了名称空间)
//**soapPayload=值**
setProperty(“mediatorPayload”,soapPayload);
返回true;
}
}

谢谢Jenananthan。我明白为什么会这样。我的有效负载中有许多属性,因此如果我可以从中介类本身设置有效负载XML,效果会更好。否则我必须写一个属性,然后读取一个属性,然后将其复制到有效负载对象。看起来像是在浪费内存和计算,也不那么优雅。感谢Jenananthan,您可以参考payloadfacotry mediator的代码在自定义mediator中设置负载。我明白为什么会这样。我的有效负载中有许多属性,因此如果我可以从中介类本身设置有效负载XML,效果会更好。否则我必须写一个属性,然后读取一个属性,然后将其复制到有效负载对象。看起来像是在浪费内存和计算,也不那么优雅。您可以参考payloadfacotry mediator的代码,在自定义mediator中设置有效负载