如何将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
答案 0 :(得分:1)
您的问题有两个:
您可以通过使用xslt构建消息来解决此问题,您可以在XSLT中添加CDATA块,如下所示:
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:copy-of select="*"/>
<xsl:text disable-output-escaping="yes">]]></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"><![CDATA[</xsl:text>
<xsl:value-of select="$acclist"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</p_acclist>
</Body>
...
</xsl:stylesheet>
在上面的示例中,您可能必须使用copy-of而不是value-of。
答案 1 :(得分:0)
由于 acclist 的内容不是有效的XML,您可以尝试使用CDATA标签将元素括起来吗?请注意,由于其限制,我们将无法直接将CDATA标签与有效负载工厂介体一起使用。您可以按照以下步骤添加CDATA标签。
使用以下元素(conf:/test/format.xml)创建注册表资源。
<Body>
<p_cif>$1</p_cif>
<p_acclist><![CDATA[$2]]></p_acclist>
</Body>
按如下所示修改有效负载工厂介体。
<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>
在<EI_HOME>
将以下内容添加到文件中
javax.xml.stream.isCoalescing=false