MVEL表达式解析报错:无效数字字面量11412Test问题求助
问题详情
使用mvel2-2.4.14-Final时,模板中写@{11412Test}会触发解析错误,报错栈如下:
Caused by: [Error: invalid number literal: 11412Test][Near : {... v>
@{11412Test} ....}]
[Line: 1, Column: 57]
at org.mvel2.util.ParseTools.isNumber(ParseTools.java:1903)
at org.mvel2.ast.ASTNode.setName(ASTNode.java:257)
at org.mvel2.ast.ASTNode.(ASTNode.java:422)
at org.mvel2.compiler.AbstractParser.createPropertyToken(AbstractParser.java:1428)
at org.mvel2.compiler.AbstractParser.nextToken(AbstractParser.java:896)
at org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:127)
at org.mvel2.MVEL.compileExpression(MVEL.java:832)
at org.mvel2.templates.res.CompiledExpressionNode.(CompiledExpressionNode.java:41)
at org.mvel2.templates.TemplateCompiler.compileFrom(TemplateCompiler.java:211)
... 131 more
单独用Test或11412时表达式可正常解析,仅数字开头的混合字符串触发问题。
根本原因
MVEL语法规则中,数字开头的字符序列会被优先尝试解析为数字字面量,11412Test不符合数字格式,因此触发解析错误。同时,MVEL不允许变量名以数字开头,即便你想引用名为11412Test的变量,也违反语法规范。
解决办法
根据实际需求场景选择对应方案:
1. 仅需输出11412Test字符串字面量
将字符串用单引号或双引号包裹,明确告知MVEL这是字符串类型:
<div><br>@{ '11412Test' }</div>
2. 需要引用变量
修改变量名为MVEL合法标识符(必须以字母、下划线_或美元符号$开头),例如将11412Test改为test11412或_11412Test,再调整表达式:
<div><br>@{ test11412 }</div>
3. 无法修改变量名(特殊业务场景)
若因业务限制不能修改变量名,可通过上下文的键值对直接获取变量值,例如假设上下文对象名为ctx:
<div><br>@{ ctx['11412Test'] }</div>
内容的提问来源于stack exchange,提问作者moh

