You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSO2 ESB数据源查询ARRAY类型paramType实现IN查询失效问题

WSO2 EI 数据服务IN查询数组参数失效解决方案

问题根因

你配置的paramType="ARRAY"参数不生效,核心原因有两个:

  • inSequence中提取code参数时强制指定了type="STRING",会把原始JSON数组打平为逗号分隔的普通字符串,丢失数组结构
  • 构造发往数据服务的XML请求时,只生成了单个<code>节点,WSO2数据服务的ARRAY类型参数要求 同名称节点重复出现,每个节点对应一个数组元素,单节点多值的格式无法被识别为数组。

你的数据服务层的参数定义、SQL写法本身没有问题,不需要调整。

具体修复步骤

1. 修正inSequence参数提取逻辑

去掉code属性的type="STRING"配置,保留原始数组结构,如果入参是逗号分隔的字符串格式,先用fn:tokenize拆分为数组:

<!-- 如果入参是JSON数组格式:{"code": ["AXB23", "ADR40"]} 用这个表达式 -->
<property expression="json-eval($.code)" name="codeList" scope="default"/>

<!-- 如果入参是逗号分隔字符串格式:{"code": "AXB23, ADR40, SMRS2"} 用这个表达式 -->
<!-- <property expression="fn:tokenize(json-eval($.code), ',\s*')" name="codeList" scope="default"/> -->

2. 构造符合数组参数要求的XML请求体

用forEach中介器遍历数组,为每个code值生成独立的<code>节点,替换原有的单节点payloadFactory配置:

<payloadFactory media-type="xml">
    <format>
        <selectTEST xmlns:xs="http://ws.wso2.org/dataservice/selectTEST"/>
    </format>
    <args/>
</payloadFactory>

<forEach expression="$ctx:codeList" id="codeLoop">
    <sequence>
        <property expression="$ctx:codeLoop" name="singleCode" scope="default" type="STRING"/>
        <payloadFactory media-type="xml">
            <format>
                <code xmlns="">$1</code>
            </format>
            <args>
                <arg evaluator="xml" expression="$ctx:singleCode"/>
            </args>
        </payloadFactory>
        <enrich>
            <source type="body" clone="true"/>
            <target action="child" xpath="//selectTEST"/>
        </enrich>
    </sequence>
</forEach>

3. 保留原有后续调用逻辑

后面的messageType设置、SOAP Action头配置、端点调用、响应转换逻辑不需要修改,直接沿用即可。

校验标准

调试时可以在call中介器前加日志打印发往数据服务的请求体,符合以下格式就说明传参正确:

<selectTEST xmlns:xs="http://ws.wso2.org/dataservice/selectTEST">
    <code>AXB23</code>
    <code>ADR40</code>
    <code>SMRS2</code>
</selectTEST>

这种格式下数据服务会自动把多个<code>节点识别为STRING类型数组,正确拼接为IN ('AXB23','ADR40','SMRS2')的SQL逻辑,不会出现参数不生效的问题。

避坑提示

  • 不要给存储数组的上下文属性指定type="STRING",否则会自动把数组序列化为逗号分隔字符串,丢失结构
  • 不要把多个code值合并到同一个<code>节点中,哪怕是逗号分隔的格式,也无法被ARRAY类型参数识别
  • 该方案同时兼容JSON数组、逗号分隔字符串两种入参格式,只需要切换第一步的属性提取表达式即可

内容的提问来源于stack exchange,提问作者EAGame

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:51:28