意外的MVEL2行为

时间:2014-11-26 11:34:48

标签: java hashmap mvel

我需要检查一个表达式是否写得很好,所以我决定使用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")

你能帮我解释一下吗?

1 个答案:

答案 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')

希望它能解决你的困惑。