首页 > 解决方案 > WSO2 Ei 代理服务和 DS

问题描述

如何将 XML 对象有效负载的属性设置为参数 () 以使用 CLOB 调用 Wso2 ds

下面是我调用 WSO2 DS 的有效载荷:

 <property name="messageType" scope="axis2" value="application/xml"/>
    <property expression="$body/*" name="acclist" scope="default" type="OM"/>
      <payloadFactory media-type="xml">
                      <format>
                         <Body>
                            <p_cif>$1</p_cif>
                            <p_acclist>$2</p_acclist>
                         </Body>
                      </format>
                      <args>
                         <arg evaluator="xml" expression="$ctx:cif"/>
                         <arg evaluator="xml" expression="$ctx:acclist"/>
                      </args>
  </payloadFactory>

WSO2 DS 的错误消息:

Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: _post_getacclist
Current Params: {p_acclist=, p_cif=00021118}
Nested Exception:-
DS Fault Message: Error in 'createProcessedPreparedStatement'
DS Code: UNKNOWN_ERROR
Nested Exception:-
java.sql.SQLRecoverableException: IO Error: 0 char of CLOB data cannot be read

我认为输入 Clob 参数(p_acclist)为空或为空,

当我将$ctx:acclist转换为 JSON 时,它设置了参数,但 XML 不起作用

我可以传递整个 $body// 它也可以正确打印,但我需要这个 XML 的内部元素。

Basically i'am calling Data service using Clob(XML object) from Proxy service

标签: wso2wso2esbwso2-amwso2dsswso2ei

解决方案


你的问题是双重的:

  1. p_acclist 元素不包含任何类型的值,而是更多的 xml。这需要在 CDATA 块中
  2. 有效负载工厂中的 CDATA 块不会像那样工作,因为配置也是 XML。因此,您的 payloadfactory/proxy 中的 CDATA 块将被忽略。

您可以通过使用 xslt 构建消息来解决此问题,在 XSLT 中您可以添加 CDATA 块,如下所示:

  <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
  <xsl:copy-of select="*"/>     
  <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>

您甚至可以像这样将您的财产传递给 xslt:

<xslt key="xlsfilereference">
     <property expression="$ctx:acclist" name="acclist">
     </property>
</xslt>

然后在 xslt 中使用如下:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:param name="acclist"></xsl:param>
      ...
         <Body>
            <p_cif><xsl:value-of select="[path_to_cif_value]"/></p_cif>
            <p_acclist>
               <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
               <xsl:value-of select="$acclist"/>    
               <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
            </p_acclist>
         </Body>
      ...
</xsl:stylesheet>

在上面的示例中,您可能必须使用 copy-of 而不是 value-of。


推荐阅读