Как использовать переменные внутри выражения MVEL? - PullRequest
0 голосов
/ 27 октября 2019

В моем коде Java есть предопределенные переменные, которые я хочу использовать внутри выражения MVEL. Я не хочу передавать контекст.

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

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

Как прочитать значения переменных и оценить выражение как true или false?

1 Ответ

1 голос
/ 27 октября 2019

Вам необходимо добавить свои переменные col1 и col2 к объекту контекста, а затем передать этот объект 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.

...