如何在JEXL中连接String和表达式

时间:2015-06-16 21:33:38

标签: java jexl

我正在使用JEXL http://commons.apache.org/proper/commons-jexl/来评估字符串。

我尝试了以下代码

        String jexlExp = "'some text ' + output?'true':'false'";
        JexlEngine jexl = new JexlEngine();
        Expression e = jexl.createExpression(jexlExp);

        JexlContext jc = new MapContext();
        jc.set("output", false);

        Object x = e.evaluate(jc);
        System.out.println(x);

正在将表达式评估为错误的结果。当我尝试连接两个字符串时,它运行良好。当我尝试连接字符串和表达式时,它无法正常工作。

那么,如何在JEXL中连接字符串和表达式?

1 个答案:

答案 0 :(得分:2)

在执行三元运算符'some text'之前,JEXL似乎正在执行output?:的串联。

使用原始表达式'some text ' + output?'true':'false',我得到true的输出。我不完全确定为什么'some text ' + false会产生true,但必须在boolean进行某种隐式转换。

使用'some text ' + output删除三元运算符,我得到some text false

在原始表达式中放置括号以明确表达正在发生的事情,我可以使用表达式true复制('some text ' + output)?'true':'false'的输出。

在三元运算符周围放置括号,我可以让三元运算符首先运算,并使用表达式some text false获得输出'some text ' + (output?'true':'false')

这是因为三元运算符?:的优先级低于JEXL中的+运算符,与Java的运算符优先级相匹配。在适当的位置添加括号会强制执行?:运算符。