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
相关产品推荐
相关产品推荐

