2016-10-23 17 views
0

次のコードスニペットでは、「引数型の不一致」というエラーが表示されます。 コメント行を使用するとうまくいきます。MVEL式の評価中に「引数型の不一致」が発生する

この現象の理由を説明できる人はいますか?

最初の式自体を評価する方法はありますか?

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

を期待通りに動作しますか? 'MapVariableResolverFactory'は' Map'引数を受け取ります – Saravana

+0

JDK 1.8とmvel2-2.3.1.Final。 –

答えて

0

MVELのバグ/制限のようですが、私はMVELコードをデバッグしました。

return文の引数の型が誤って実際にStringが、発現

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

ためint

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

として検出し、スローされたMVELによって検出された

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

以下の式あなたは、あなたがどのバージョンを使用しているMVELの最新バージョンでコンパイルエラーを取得

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 
関連する問題