我需要检查一个表达式是否写得很好,所以我决定使用MVEL2来做到这一点。 我有一个像
这样的表达式String expression = "(OPVAL == 'OPERATION') && (DAT > '12345')"
和像
这样的哈希映射Map<String, Object> vars = new HashMap<String, Object>();
{OPVAL = "OPERATION", DATA = "0"}
当我用MVEL处理它时,
(Boolean)MVEL.eval(expression, vars);
我期待异常,因为未映射DAT,而MVEL2库仅返回FALSE条件。
如果我使用像
这样的表达式String expression = (DAT > '15/11/2014') && (OPVAL == 'Operazione')
我得到了预期的异常,另一个我得到异常的例子就是:
String expression = (OPVAL != "Operazione") AND (DAT < "15/11/2014")
你能帮我解释一下吗?
答案 0 :(得分:1)
我在所有三种情况下都遇到了同样的错误。
unresolvable property or identifier: DAT
记住 - 在评估表达式"(OPVAL == 'OPERATION') && (DAT > '12345')"
时,MVEL使用AST tree
结构来解析任何给定的表达式,然后进行评估。
如果(OPVAL == 'OPERATION')
为false,则永远不会评估(DAT > '12345')
,因为两者之间有&&
运算符。
仔细看一遍,然后玩弄你的表情,或者在前面移动(DAT > '12345')
,然后进行测试。
仅供参考,请参阅以下代码
案例1
public static void main(String args[]) throws Exception {
String expression = "(OPVAL == 'OPERATION') && (DAT > '12345')";
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("OPVAL", "OPERATION1");
vars.put("DATA", "0");
System.out.println(MVEL.eval(expression, vars));
}
<强>输出强>
false
由于(OPVAL == 'OPERATION')
评估为false。
案例2
public static void main(String args[]) throws Exception {
String expression = "(OPVAL == 'OPERATION') && (DAT > '12345')";
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("OPVAL", "OPERATION");
vars.put("DATA", "0");
System.out.println(MVEL.eval(expression, vars));
}
<强>输出强>
Exception in thread "main" [Error: unresolvable property or identifier: DAT]
[Near : {... (OPVAL == 'OPERATION') && (DAT > '12345') ....}]
因为在这种情况下,(OPVAL == 'OPERATION')
的计算结果为true,所以它会进一步遍历以评估(DAT > '12345')
。
希望它能解决你的困惑。