2013-05-22 33 views
4

我正嘗試在ESB中編寫一個序列,並使用有效負載工廠填充我的有效負載數據,如我在下面的示例中所述。WSO2中的有效負載工廠中的CDATA ESB

<payloadFactory> 
    <format> 
     <p:echoInt xmlns:p="http://echo.services.core.carbon.wso2.org"> 
      <in xmlns="">$1</in> 
     </p:echoInt> 
    </format> 
    <args> 
     <arg xmlns:ns="http://org.apache.synapse/xsd" expression="an-xml-formatted-string"/> 
    </args> 
    </payloadFactory> 
<send> 
    <endpoint> 
     <address uri="http://noon101:8280/services/echo" format="soap11"/> 
    </endpoint> 
    </send> 

,因爲當我這個有效載荷發送到服務我的字符串格式爲XML,該服務將嘗試解析我的XML參數和(我不明白什麼是確切的原因)我的web服務方法不叫。在這link它說,如果我使用cdata比分析器不會解析我的xml格式化的字符串,並且將沒有問題。

但問題是有效載荷廠調停其內容不接受C數據。當我按照如下所示編寫Payload Factory的配置時,它會從中刪除CDATA關鍵字,並且問題包含在內。

<payloadFactory> 
    <format> 
     <p:echoInt xmlns:p="http://echo.services.core.carbon.wso2.org"> 
      <in xmlns=""> <![CDATA[ $1 ]]> </in> 
     </p:echoInt> 
    </format> 
    <args> 
     <arg xmlns:ns="http://org.apache.synapse/xsd" expression="an-xml-formatted-string"/> 
    </args> 
    </payloadFactory> 

這個問題的解決方案是什麼?任何其他中介設置負載或任何解決方法將不勝感激。

回答

2

您可以使用XSLT調解員到(有效載荷工廠調解員不支持CDATA)。但是,如果你使用它。而且您還需要執行以下配置以在中介流中保留CDATA。 [1]

這也會有幫助。 http://tharindumathew.com/2012/05/24/adding-cdata-tags-through-xslt/

[1] http://blog.shelan.org/2013/03/how-to-send-cdata-inside-your-soap.html

+0

確定我是使用xsl轉換,但是出現了一個新問題。當我wroto 的 < [CDATA [ 的! 的]] > ESB禁用的&lt等,並轉化進入一個奇怪的方式。 – Alper

+0

這不是一個確切和直接的解決方案,但我的問題,但你的鏈接是非常有用的解決我的問題,所以我接受這個答案。 – Alper

0

,如果你想通過CDATA,您可以使用XSLT中介來構建這樣的消息。 Payload工廠,AFAIK不支持CDATA參數。

+0

我找不到任何使用esb中的xslt轉換設置有效載荷數據的簡單資源,你能推薦一些嗎? – Alper

+0

xslt mediator使用xslt腳本,並且您需要編寫xslt腳本.XSLt mediator smaples,您可以在ESb文檔中找到 – Ratha

+0

我試過但它不起作用。它給出了這樣的錯誤:org.apache.axiom.om.OMException:致com.ctc.wstx.exc.WstxUnexpectedCharException:意外的字符「C」(代碼67)(CDATA序言中不允許/收尾) – zygimantus

3

您可以使用CDATA有效載荷工廠內調解。你需要做的唯一事情是,你需要將格式存儲在註冊表中並從那裏使用它。 Registry Resource

下面是一個示例。在本示例中,我正在使用之前調用的響應作爲正在使用有效負載工廠調解器準備的消息的輸入。

 <property xmlns:ns="http://org.apache.synapse/xsd" 
       name="ALLRESULTS" 
       expression="$body/child::*[fn:position()=1]" 
       scope="default" 
       type="STRING"/> 

    <payloadFactory media-type="xml"> 
     <format key="conf:/repository/esb/myPF"/> 
     <args> 
      <arg evaluator="xml" expression="$ctx:ALLRESULTS"/> 
      <arg value="1"/> 
     </args> 
    </payloadFactory> 

註冊表資源的內容如下。

     <ns:testMethod xmlns:ns="http://example.com"> 
          <xs:xmlBody xmlns:xs="http://example.com"><![CDATA[$1]]></xs:xmlBody> 
          <xs:sessionId xmlns:xs="http://example.com">$2</xs:sessionId> 
         </ns:testMethod> 

通過這種方式,您可以在有效載荷工廠介體中使用CDATA。

+0

這實際上是解決方案。 – zygimantus