Постановка задачи: Допустим, у меня есть выражение (a + b + c)
, и я хочу вычислить его значение и присвоить его некоторой переменной. Позже я хочу использовать это значение переменной в какой-то другой логике. Это все делается через МВЭЛ. Проблема в том, что если кто-то из (a,b,c)
является null
, MVEL оценивает в строковом формате.
Поэтому, чтобы избежать этого, я создал свою собственную функцию для передачи каждого объекта, и если он равен нулю, сделать его равным нулю.
Пример кода ниже
public class MvelTest {
public static void main(String[] args) {
Map map = new HashMap();
VariableResolverFactory functionFactory = new MapVariableResolverFactory(map);
MVEL.eval("checkNullValue = def (x) { x == null ? 0 : x };", functionFactory);
map.put("a", null);
map.put("b", 1);
map.put("c", 1);
Serializable str = MVEL.compileExpression("( ( checkNullValue(a) + checkNullValue(b) + checkNullValue(c) ) > 2 ) ? d=2 : d=3");
MVEL.executeExpression(str, map, functionFactory);
System.out.println(map);
System.out.println(map.get("d"));
}
}
Выход
{checkNullValue=function_prototype:null, b=1, c=1, a=null}
null
Я не могу получить здесь значение "d"
, и если я удалю фабрику и функцию проверки нуля, она будет себя вести, и я смогу получить значение "d"
. Но я должен сделать его нулевым безопасным для арифметических операций, так как MVEL не может с этим справиться.
Также (null * 23)
, МВЭЛ возвращается как false
.
MVEL.compileExpression("d = (cnv(a) + cnv(b) + cnv(c) > 2) ? 2 : 3")
- person tobias_k   schedule 16.06.2014d
доступен в другом правиле, не говоря уже о проблеме, что порядок оценки (не срабатывания!) логики LHS абсолютно не определен. Передача данных между правилами должна осуществляться с помощью фактов. - person laune   schedule 16.06.2014