【问题标题】:Setting SOAP Envelope Payload in a Custom Mediator在自定义中介器中设置 SOAP 信封有效负载
【发布时间】: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;
    }
}

【问题讨论】:

    标签: wso2 wso2esb


    【解决方案1】:

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

    在您的类调解器中,仅将正文有效负载设置为属性,然后使用脚本将该值作为有效负载插入到主流中,这将解决您的问题。

    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;
        }
    }
    

    【讨论】:

    • 谢谢詹南坦。我明白为什么会这样。我的有效负载中有很多属性,所以如果我可以从中介类本身设置有效负载 XML,那就更好了。否则我必须编写一个属性,然后读取一个属性,然后将其复制到有效负载对象。似乎是在浪费内存和计算,而且也不那么优雅。
    • 可以参考payloadfacotry mediator的代码在自定义mediator中设置payloadgithub.com/wso2/wso2-synapse/blob/master/modules/core/src/main/…
    猜你喜欢
    • 2019-04-21
    • 2010-11-11
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2020-04-11
    • 2018-12-26
    相关资源
    最近更新 更多