在我的序列中,我正在将JSON请求转换为XML,这样我就可以对插入到表中的SQL Server存储过程进行dataServiceCall.这一切都很好,但是如果其中一个字段为null,它将作为空字符串("")而不是NULL插入.

当我查看发送到dataServiceCall的XML时,它看起来如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<InsertWebAppPath xmlns="http://ws.apache.org/ns/synapse">
<pathTemplate>/postmanTest</pathTemplate>
<label2>Postman Test</label2>
<icon>test</icon>
<isActive>false</isActive>
<label1>Postman Test</label1>
<label3 nil="true"/>
</InsertWebAppPath>
</soapenv:Body>
</soapenv:Envelope>

从JSON到XML的转换在Label3上添加了nil="true"属性,这是我所期望的.但是INSERT仍然以空字符串而不是NULL结束.我try 在我的查询中添加defaultValue#{NULL},这没有什么不同.

以下是我的顺序:

  <property name="messageType" scope="axis2" type="STRING" value="text/xml"/>
  <payloadFactory media-type="xml">
    <format>
      <InsertWebAppPath>$1</InsertWebAppPath>
    </format>
    <args>
      <arg evaluator="json" expression="$"/>
    </args>
  </payloadFactory>
            
  <dataServiceCall description="InsertWebAppPath" serviceName="myService">
    <source type="body"/>
    <target type="body"/>
  </dataServiceCall>

和DBS文件:

    <query id="InsertWebAppPath" useConfig="myDSS">
        <sql>{ call InsertWebAppPath(?,?,?,?,?,?) }</sql>
        <param type="IN" name="pathTemplate" paramType="SCALAR" sqlType="STRING" optional="false" />
        <param type="IN" name="isActive" paramType="SCALAR" sqlType="BOOLEAN" optional="false" />
        <param type="IN" defaultValue="#{NULL}" name="label1" paramType="SCALAR" sqlType="STRING" optional="true" />
        <param type="IN" defaultValue="#{NULL}" name="label2" paramType="SCALAR" sqlType="STRING" optional="true" />
        <param type="IN" defaultValue="#{NULL}" name="label3" paramType="SCALAR" sqlType="STRING" optional="true" />
        <param type="IN" defaultValue="#{NULL}" name="icon" paramType="SCALAR" sqlType="STRING" optional="true" />
    </query>
    <operation name="InsertWebAppPath">
        <call-query href="InsertWebAppPath">
            <with-param name="pathTemplate" query-param="pathTemplate" />
            <with-param name="isActive" query-param="isActive" />
            <with-param name="label1" query-param="label1" />
            <with-param name="label2" query-param="label2" />
            <with-param name="label3" query-param="label3" />
            <with-param name="icon" query-param="icon" />
        </call-query>
    </operation>

存储过程直接插入值,不进行任何操作.我还确认,如果我在WSO2之外使用NULL来调用它,它将会工作.

推荐答案

在研究了Always Learning的建议后,我能够让它工作起来.我使用了XSLT转换来添加XSI名称空间和绑定.我仍然欢迎不使用定制转换的其他建议,但这对我的目的来说已经足够了.

编辑:具体地说,我在payloadFactory和dataServiceCall之间的序列中添加了下面这一行:

<xslt description="addXsiNamespace" key="conf:endpoints/addXsiNamespace.xslt"/>

这是我在资源注册表中的XSLT映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>
    <xsl:template match="@nil">
       <xsl:attribute name="xsi:nil">
          <xsl:value-of select="."/>
       </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

Sql相关问答推荐

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

基于列对多行求和的查询

GROUP BY与多个嵌套查询T—SQL

为什么postgres中CURRENT_TIMESTAMP的日期与CURRENT_DATE不同?

如何退回当年的所有参赛作品?""

通过 Select 值的顺序进行排序ClickHouse

解析键-值对,根据值 Select ,并使用SQL创建新列

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

DBeaver将过程中的属性列表转换为字符串

如何在SQL Server中统计按备注分组的记录数

如果多行科目有一行在指定的日期范围内,如何 Select 该科目在该日期之前的所有行?

基于多参数的SQL Server条件过滤

获取主表条目,其中最新的辅助条目是 6 个月前

group by 并根据同表中其他列的某些条件获取 group by 中的某一列值

仅当 SQL Server 中的表为开时,才在存储过程中使用更改跟踪

删除对 JSON 数据的未解析引用的 SQL71502 警告

在 postgres 中插入或更新 jsonb 数组的对象

PostgreSQL 中将数据从 JSONB 类型转换为 Array 类型

pyspark 将列转换为行

有条件求和