如何在SpEL中嵌套引用?Spring Batch用jobParameters取Map值求助
Spring Batch SpEL引用Map值失败的解决办法
你的问题出在嵌套使用了SpEL表达式标记#{...}——外层已经是SpEL解析环境了,内部不需要再用#{}包裹变量引用。
正确写法
直接用以下表达式即可获取对应值:
#{abc[jobParameters['jobId']]}
额外注意:类型匹配问题
如果你的jobParameters['jobId']是数值类型(比如Long/Integer),而Map的键是字符串类型的"12",会因为类型不匹配取不到值,这时候需要显式转换类型:
#{abc[String(jobParameters['jobId'])]}
示例配置参考
<util:map id="abc"> <entry key="12" value="BMW"/> </util:map> <!-- 在Spring Batch组件中使用正确的SpEL --> <step id="exampleStep"> <tasklet> <chunk reader="itemReader" writer="itemWriter" commit-interval="10"/> <listeners> <listener ref="exampleListener"> <property name="carBrand" value="#{abc[String(jobParameters['jobId'])]}"/> </listener> </listeners> </tasklet> </step>
原理:SpEL上下文里可以直接访问已定义的Bean(比如abc这个Map)和jobParameters对象,嵌套#{}会让解析器把内部的表达式当成普通字符串处理,自然无法正确取值。
内容的提问来源于stack exchange,提问作者confused human
相关产品推荐
相关产品推荐

