Java SPEL能否单行计算多个表达式 类似ExpressionFactory多表达式处理
SPEL多表达式拼接执行问题解答
Spring 表达式语言(SPEL)本身不支持直接传入多个拼接的独立表达式进行单次解析,你遇到的报错正是因为SPEL解析器单次仅能识别一个合法的表达式结构,多余的表达式内容会被判定为非法字符。
报错原因说明
- 第一次加
#{}包裹的写法报错:#{...}是Spring模板、配置注入场景下用来标识SPEL表达式的分隔符,直接调用SpelExpressionParser.parseExpression()方法时不需要加该包裹,解析器识别到{时会判定为非预期的非法字符。 - 第二次直接拼接两个表达式的写法报错:
SPEL解析器完成第一个#jsonPath(...)表达式的解析后,发现后续还有#开头的内容不属于当前表达式的合法组成部分,因此抛出剩余内容无法解析的异常。
可行解决方案
方案1:单表达式内完成结果拼接
如果你的需求是将两个表达式的执行结果拼接为字符串,可以直接在同一个SPEL表达式中使用+运算符拼接两个方法的返回值:
Expression expressionMulti = parser.parseExpression( "#jsonPath(#jsonDataObject,'$.customData.price') + #jsonPath(#jsonDataObject,'$.previousResponse')"); // 如果两个返回值不是字符串类型需要转字符串的话,可以加空字符串拼接: // Expression expressionMulti = parser.parseExpression( "#jsonPath(#jsonDataObject,'$.customData.price') + '' + #jsonPath(#jsonDataObject,'$.previousResponse')");
方案2:拆分多表达式逐个执行
如果你需要执行完全独立的多个表达式,可以先通过正则匹配将输入内容按#{...}分隔符拆分提取出所有独立的表达式片段,逐个调用解析、执行方法,最后再按需求合并执行结果即可。
内容的提问来源于stack exchange,提问作者Kamble
相关产品推荐
相关产品推荐

