1

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

你能给我一个解释吗?

4

1 回答 1

1

在所有三种情况下,我都遇到了同样的错误。

unresolvable property or identifier: DAT

记住- 在评估表达式时"(OPVAL == 'OPERATION') && (DAT > '12345')",MVEL 使用AST tree结构来解析任何给定的表达式,然后进行评估。

此外,如果(OPVAL == 'OPERATION')为假,那么它将永远不会评估(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')评估为假。

案例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')评估为真,所以它进一步遍历评估(DAT > '12345')

希望它能解决你的困惑。

于 2014-11-26T15:38:15.673 回答