WSO2 Ei代理服务和DS

时间:2019-10-01 10:25:07

标签: wso2 wso2esb wso2-am wso2dss wso2ei

如何将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

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

当我将 $ ctx:acclist 转换为JSON时,会在参数中设置它,但是XML无法正常工作

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

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

2 个答案:

答案 0 :(得分:1)

您的问题有两个:

  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。

答案 1 :(得分:0)

由于 acclist 的内容不是有效的XML,您可以尝试使用CDATA标签将元素括起来吗?请注意,由于其限制,我们将无法直接将CDATA标签与有效负载工厂介体一起使用。您可以按照以下步骤添加CDATA标签。

  1. 使用以下元素(conf:/test/format.xml)创建注册表资源。

    <Body> <p_cif>$1</p_cif> <p_acclist><![CDATA[$2]]></p_acclist> </Body>

  2. 按如下所示修改有效负载工厂介体。

    <payloadFactory media-type="xml"> <format key="conf:/test/format.xml"/> <args> <arg evaluator="xml" expression="$ctx:cif"/> <arg evaluator="xml" expression="$ctx:acclist"/> </args> </payloadFactory>

  3. <EI_HOME>

    中创建一个名为XMLInputFactory.properties的文件

    将以下内容添加到文件中

    javax.xml.stream.isCoalescing=false