对于以下代码段,我收到错误“参数类型不匹配”。 如果我使用注释行,它工作正常。
有人可以解释这种行为的原因吗?
有没有办法让第一个表达式本身得到评估?
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);
答案 0 :(得分:0)
这似乎是MVEL中的错误/限制,我调试了MVEL代码。
MVEL错误地检测到return
语句中的参数类型,实际上是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