How to Use Variables Inside an Mvel Expression?
I Have Pre-Defined Variables in My Java Code Which I Want to Use Inside an Mvel Expression. I Don't Want to Pass a Context. String Col1 = "C"; String Col2 =...
I have pre-defined variables in my Java code which I want to use inside an MVEL expression. I don't want to pass a context.
String Col1 = "C";
String Col2 = "D";
String expression = "Col1 == 'C' && Col2 == 'D'";
Boolean result = (Boolean) MVEL.eval(expression);
How do I read the variable values and evaluate the expression to true or false?
1 Answer
You need to add your variables, col1 and col2 to a context object and then pass this object to MVEL.eval. Given below is the working example:
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
}
}
Feel free to let me know in case you have any further doubt.
Update: the following update is to explain why you need the context object (you have mentioned in your comment that you do not want to add your variables to a context object).
If you look into the documentation at , you will be tempted to use the following method:
public static Object eval(String expression) {
return new MVELInterpretedRuntime(expression, new ImmutableDefaultFactory()).parse();
}
However, the following piece of code will fail to compile:
String col1 = "C";
String col2 = "D";
String expression = "col1 == 'C' && col2 == 'D'";
System.out.println(new MVELInterpretedRuntime(expression, new ImmutableDefaultFactory()).parse());
The reason for this is, the visibility of the following constructor is not public.
MVELInterpretedRuntime(String expression, VariableResolverFactory resolverFactory) {
setExpression(expression);
this.variableFactory = resolverFactory;
}
So, you need to populate a context object in your client program and pass this object, along with the expression, to the program/method evaluating MVEL expression. In my program, it is the main method where I am populating the context object as well as evaluating the MVEL expression.