获取JEXL中的表达式值

时间:2018-12-11 16:44:18

标签: java jexl

具有以下JEXL表达式:

String expression = "myVar >= 12345 && mySecondVar <= 56789";

我可以调用createScript和getVariables来获取myVar和mySecondVar作为值,例如:

Set<List<String>> expressionVars = JEXL.createScript(expression).getVariables();


我想知道的是,如果给出相同的表达式,我可以调用其他方法来返回这些变量的值。原因是我想验证其中一些值的输入。我检查了一下文档,并使用了 JexlScript 类,但是找不到一种优雅的方法。
由于JEXL已经在做我的表达式解析工作,因此能够检索此信息,而不必手动解析我的表达式以获得该值。

    script.getValue("myVar");返回12345

2 个答案:

答案 0 :(得分:0)

使用JEXL,您可以在给定上下文(JexlContext)中评估包含变量及其值的脚本/表达式。 JexlContext公开了“ has”和“ get”方法,分别检查是否存在并获取变量的值。 在您的情况下,您需要找出您的JexlContext是(或应该是)。从那里开始,直接遍历变量(从脚本中提取)并检查变量的值(从上下文中)非常简单。

请参阅: http://commons.apache.org/proper/commons-jexl/apidocs/org/apache/commons/jexl3/JexlContext.html http://commons.apache.org/proper/commons-jexl/apidocs/org/apache/commons/jexl3/JexlScript.html

答案 1 :(得分:0)

您应该实现自己的上下文:

public class ZenContext implements JexlContext {
  static private final Map<String, Object> reservedVars = new HashMap<String, Object>();
  private final Map<String, Object> scriptDefinedVars  = new HashMap<String, Object>();
  static {
    reservedVars.put("math", java.lang.Math.class);
    reservedVars.put("stats", apache.commons.math3.stats.Stats);
    // whatever else ...
  }

  public boolean has(String name) {
    if (reservedVars .get(name) != null) return true;
    return scriptDefinedVars.get(name) != null;
  }

  public boolean get (String name) {
    Object value = null;
    if ((value = reservedVars .get(name)) != null) return value;

    return scriptDefinedVars.get(name);
  }

  public void set(String name, Object value) {
    scriptDefinedVars.set(name, value);
  }

  public Map<String, Object> getReservedVars () {
    return reservedVars;
  }
  public Map<String, Object> getScriptDefinedVars   () {
    return scriptDefinedVars ;
  }
}

这样,您将拥有

  • 包含对象的保留var名称的映射,您不允许脚本更改其值。例如
  • 可以从脚本中设置的单独的var映射。

然后添加这些方法。

public Object execute(File scriptFile) {
    JexlScript script = jexlEngine.createScript(scriptFile);
    return script.execute(this); // supply this as the context 
}
public Object execute (String scriptText) {
    JexlScript script = jexlEngine.createScript(scriptText);
    return script.execute(this); // supply this as the context 
}

您可以修改我在此处编写的set方法,以在允许设置之前检查地图中的变量。

但是,这不适用于本地脚本vars

var greeting = 'The rain in Maine falls plainly insane';

因为本地var使用getLocalVariables()方法依赖于另一种机制org.apache.commons.jexl3.internal.Scope,这有一个错误。