2016-10-23 4 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

Получение ошибки компилятора с последней версией mvel, какую версию вы используете? 'MapVariableResolverFactory' ожидает аргумент« Карта » – Saravana

+0

JDK 1.8 и mvel2-2.3.1.Final. –

ответ

0

Кажется, ошибка или ограничение в MVEL, я отладил код MVEL.

Тип аргумента в return заявлении ошибочно детектируется 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 
Смежные вопросы