如何在MVEL表达式中使用变量?

时间:2019-10-27 13:37:38

标签: java mvel

我在Java代码中有预定义的变量,希望在MVEL表达式中使用。我不想传递上下文。

String Col1 = "C";
String Col2 = "D";
String expression = "Col1 == 'C' && Col2 == 'D'";

Boolean result = (Boolean) MVEL.eval(expression);

我如何读取变量值并将表达式评估为true或false?

1 个答案:

答案 0 :(得分:0)

您需要将变量col1col2添加到上下文对象,然后将此对象传递给MVEL.eval。下面给出的是工作示例:

import java.util.HashMap;
import java.util.Map;

import org.mvel2.MVEL;

public class Test {
    public static void main(String[] args) {
        Map<String, Object> context = new HashMap<String, Object>();

        String col1 = "C";
        String col2 = "D";

        context.put("col1", col1);
        context.put("col2", col2);

        String expression = "col1 == 'C' && col2 == 'D'";
        Boolean result = (Boolean) MVEL.eval(expression,context);
        System.out.println(result);//true

        expression = "col1 == 'E' && col2 == 'D'";
        result = (Boolean) MVEL.eval(expression,context);
        System.out.println(result);//false
    }
}

如有任何疑问,请随时告诉我。

更新:以下更新是为了解释为什么需要上下文对象(您在注释中提到不想将变量添加到上下文对象)。

如果您查看https://github.com/mvel/mvel/blob/master/src/main/java/org/mvel2/MVEL.java上的文档,则很容易使用以下方法:

public static Object eval(String expression) {
    return new MVELInterpretedRuntime(expression, new ImmutableDefaultFactory()).parse();
}

但是,以下代码将无法编译:

String col1 = "C";
String col2 = "D";
String expression = "col1 == 'C' && col2 == 'D'";
System.out.println(new MVELInterpretedRuntime(expression, new ImmutableDefaultFactory()).parse());

其原因是,以下构造函数的可见性不是public

MVELInterpretedRuntime(String expression, VariableResolverFactory resolverFactory) {
    setExpression(expression);
    this.variableFactory = resolverFactory;
}

因此,您需要在客户端程序中填充上下文对象,并将该对象以及表达式传递给评估MVEL表达式的程序/方法。在我的程序中,这是main方法,用于填充上下文对象以及评估MVEL表达式。