0

我有数据对象,您可以将其视为“简化地图”。有方法get(String),和put(String,Object),但基本上就是这样。

现在,我想使用 JEXL 来评估我的数据对象上的复杂表达式。我可以通过创建一个自定义 JexlContext 来做到这一点,它适用于"foo"foo != null. 但是,一旦我尝试使用类似"foo.bar"的表达式,Jexl 就会失败并显示错误消息“无法解析的属性”。显然,Jexl 使用我的自定义 JexlContext 来评估"foo",但不能评估foo 对象上的"bar" 。我的印象是,我必须使用自定义的 PropertyResolver。我可以实现它,但我无法弄清楚。如何将其带入游戏,因为 JexlUberspect 不包含setResolvers, 或addResolver.

4

1 回答 1

0

类似于重复的问题,我想你可以这样做:

public class ExtendedJexlArithmetic extends JexlArithmetic
{
    public Object propertyGet(YourCustomClass left, YourCustomClass right)
    {
       // ...
    }
}

JexlEngine jexlEngine=new JexlBuilder().arithmetic(new ExtendedJexlArithmetic (true)).create();
// or
JexlEngine jexl = new JexlEngine(null, new ExtendedJexlArithmetic(), null, null);

来自文档:https ://commons.apache.org/proper/commons-jexl/apidocs/org/apache/commons/jexl3/package-summary.html

您还可以添加方法来重载属性 getter 和 setter 运算符行为。名为 propertyGet/propertySet/arrayGet/arraySet 的 JexlArithmetic 实例的公共方法是潜在的覆盖,将在适当的时候调用。下表概述了句法形式和调用方法之间的关系,其中 V 是属性值类,O 是对象类,P 是属性标识符类(通常是 String 或 Integer)。

Expression                   Method Template
foo.property              public V propertyGet(O obj, P property);

foo.property = value      public V propertySet(O obj, P property, V value);

foo[property]             public V arrayGet(O obj, P property, V value);

foo[property] = value     public V arraySet(O obj, P property, V value);
于 2020-03-11T12:13:45.807 回答