代码之家  ›  专栏  ›  技术社区  ›  Anushka Ekanayake

如何用wso2ei更新soap响应命名空间值

  •  0
  • Anushka Ekanayake  · 技术社区  · 6 年前

    我有一个代理服务来公开wso2ei上的soapi,我需要用我的代理服务更新soap响应的名称空间值并返回另一个名称空间值。

    <property name="namespace"
                   scope="default"
                   type="STRING"
                   value="http://tempuri-updated.org/"/>
          <enrich>
            <source clone="false" property="namespace" type="property"/>
            <target xmlns:ser="http://services.samples"
                    xmlns:ns="http://org.apache.synapse/xsd"
                    xpath="namespace-uri($body/*)/text()"/>
         </enrich>
    

    我得到这个错误。

    错误-EnrichMediator要充实的目标对象无效。

    我的实际soap响应如下

    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <soap:Body>
          <AddResponse xmlns="http://tempuri.org/">
             <AddResult>12</AddResult>
          </AddResponse>
       </soap:Body>
    </soap:Envelope>
    

    我的预期产出如下

    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <soap:Body>
          <AddResponse xmlns="http://tempuri-updated.org/">
             <AddResult>12</AddResult>
          </AddResponse>
       </soap:Body>
    </soap:Envelope>
    

    欢迎您的反馈

    0 回复  |  直到 6 年前
        1
  •  3
  •   Thishani Lucas    6 年前

    这不能用调解人来完成。因为在相关的代码中丰富了中介目标的处理 [1] ,xpath表达式的解析结果应为SOAPHeaderImpl、OMElement、OMText或OMAttribute之一。由于namespace-uri()只是返回一个字符串值,因此要充实的目标将变得无效。作为这个用例的替代方案,我们可以使用XSLT中介进行XSLT转换。下面是我尝试的XSL样式表示例。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="@* | comment() | processing-instruction()">
        <xsl:copy/>
        </xsl:template>
    
       <xsl:template match="*">
           <xsl:element name="{local-name()}"
                 namespace="http://tempuri-updated.org/">
           <xsl:apply-templates select="@* | node()"/>
           </xsl:element>
        </xsl:template>
    

    在从EI发送响应之前,我们可以在XSLT中介器中引用这个样式表。新的命名空间将被添加到主体中。

        2
  •  -1
  •   Bee    6 年前

    试试这个。

    http://codertechblog.com/wso2-change-payload-soap-envelope-namespace/

    <sequence name="seTestChangeNamespace" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    (...)
    <enrich>
    <source type="body"/>
    <target type="property" property="INPUT_MESSAGE"/>
    </enrich>
    <enrich>
    <source type="inline">
    <myns:Envelope xmlns:myns="http://schemas.xmlsoap.org/soap/envelope/">
    <myns:Body/>
    </myns:Envelope>
    </source>
    <target type="envelope"/>
    </enrich>
    <enrich>
    <source type="property" property="INPUT_MESSAGE"/>
    <target type="body"/>
    </enrich>
    (...)
    </sequence>
    
    推荐文章