MVEL使向解析器上下文提供自定义函数非常容易,但是尚不清楚是否存在“官方”方式来重载运算符的求值方式。我想到了两个特定的用例:


在数组上执行算术运算应将操作映射到数组的每个元素上,从而:

[1, 2, 3] + 1 == [2, 3, 4]
操作数为空的任何操作都应评估为空(如Excel中的#N/A),使得:

1 + null == null


如果没有对此的“官方”解决方案,那么有没有一种明显的方法可以侵入MVEL来实现这一目标?

最佳答案

第二期

1+ null == null


1* null

如果您实际上在Mvel API类中对此进行调试,则对于这种特殊情况,它们将显式返回false1null

如果Mvel可以解决此问题,那将是很好。但是我也遇到了同样的问题,所以我们做的是,在执行表达式之前创建了一些智能,修改了表达式并添加了“ IF”条件,以检查是否为空并且将运算符设置为“ /”或“ *” ”,则返回null。

您也可以使用VariableResolverFactory并通过如下所示的函数

 private static VariableResolverFactory getMvelFactory(Map contextMap) {
        VariableResolverFactory functionFactory = new MapVariableResolverFactory(contextMap);
        MVEL.eval("checkNullValue = def (x) { x == null ? 0 : x };", functionFactory);

        return functionFactory;
    }


因此,您可以通过以下方式修改可执行表达式并返回任何值。基本上需要在MVEL之上编写包装器。

a + bcheckNullValue(a) + checkNullValue(b)

09-12 10:34