如何处理JDBC出站查询参数中的空格?Spring Integration配置疑问
Spring Integration JDBC出站适配器:引用带空格Payload键的正确姿势
嘿,这个问题我之前做Spring Integration项目时也踩过坑,咱们来一步步说清楚:
你的问题回顾
你在配置<int-jdbc:outbound-channel-adapter>时,想引用Payload里带空格的键DEALER CODE,试过几种写法都不行:
:payload[DEALER CODE]:无法正确识别键名:payload['DEALER CODE']/:payload["DEALER CODE"]:直接抛出异常,提示找不到payload[这个属性
虽然你通过ExpressionEvaluatingSqlParameterSourceFactory配置映射解决了问题,但觉得这种方式只是读取Payload字段却要额外写一堆配置,太繁琐,想知道是不是自己用错了语法。
为啥直接写不行?
这是因为JDBC出站适配器的:payload[...]是一种简化的参数绑定语法,它的解析逻辑和原生SpEL不一样:
- 不带引号的
DEALER CODE会被解析器拆成DEALER和CODE两部分,没法匹配到正确的键 - 加引号的写法会被错误识别:解析器把
payload['当成了一个完整的属性名,而不是理解为“取payload里的DEALER CODE键”,这就是你看到异常的根源
更简洁的正确写法
其实你可以直接用原生SpEL表达式的完整写法,把参数用#{...}包裹起来,这样就能正确识别带空格的键了:
<int-jdbc:outbound-channel-adapter query="INSERT INTO table (serial, dealer_code) VALUES (#{payload['SERIES']}, #{payload['DEALER CODE']})" data-source="dbDataSource"> </int-jdbc:outbound-channel-adapter>
这种写法让Spring直接解析里面的SpEL表达式,完美适配带空格的键名,不需要额外配置工厂类,比你之前的方法简洁太多啦!
为啥HTTP适配器里引号能用?
你提到在<int-http:inbound-channel-adapter>的status-code-expression里可以正常用引号,这是因为HTTP模块的这个属性本身就是直接接收SpEL表达式,而JDBC的:parameter是简化绑定语法,两者的解析规则不一样,所以会有这种差异。
内容的提问来源于stack exchange,提问作者watery
相关产品推荐
相关产品推荐

