问题陈述:假设我有一个表达式(a + b + c)
,我想计算它的值并分配给某个变量。稍后我想在其他逻辑中使用该变量值。这一切都是通过 MVEL 完成的。问题是如果有人不在(a,b,c)
is 中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)
,MVEL 返回为false
.