在 MVEL 表达评估期间获得"argument type mismatch"



对于下面的代码片段,我得到错误"参数类型不匹配"。如果我使用注释行,它可以正常工作。

有人能解释一下这种行为的原因吗?

是否有一种方法可以让第一个表达式本身求值?

VariableResolverFactory functionFactory = new MapVariableResolverFactory();    
Object value = MVEL.eval("def StringValueWithLength(str) { int myLen = str.toString().length(); return String.valueOf(str) + ":" + myLen; }; StringValueWithLength("qwert");", functionFactory);
//Object value = MVEL.eval("def StringValueWithLength(str) { return String.valueOf(str) + ":" + str.toString().length(); }; StringValueWithLength("qwert");", functionFactory);
System.out.println("Value : " + value);

这似乎是MVEL中的一个错误/限制,我调试了MVEL代码。

return语句中的参数类型被MVEL错误地检测到,MVEL实际上是String,但检测为int

public static java.lang.String java.lang.String.valueOf(int)

表示表达式

Object value = MVEL.eval("def StringValueWithLength(str) { int myLen = str.toString().length(); return String.valueOf(str) + ":" + myLen; }; StringValueWithLength("qwert");", functionFactory);

抛出
Caused by: java.lang.IllegalArgumentException: argument type mismatch.

下面的表达式如您所愿

String expr = "def StringValueWithLength(str) { int myLen = str.length(); return String.valueOf(str) + ":" + myLen; }; StringValueWithLength("qwert");"; // removed toString

String expr = "def StringValueWithLength(str) { int myLen = str.toString().length(); return str + ":" + myLen; }; StringValueWithLength("qwert");"; // removed String.valueOf

相关内容

最新更新