MVEL Null-Safe 运算符是否适用于方法?

Does the MVEL Null-Safe operator work on methods?

我有一个关于 MVEL 空安全 (?) 运算符的问题。

假设我有以下 Java class:

public class Traveler {

    private Set<String> visitedCountries;

    public Set<String> getVisitedCountries() {
        return visitedCountries;
    }
}

如果我有这样的 MVEL 表达式:

traveler.visitedCountries.contains("France")

如果 visitedCountries 字段为空,我会得到一个 NullPointerException。为了解决这个问题,我可以使用空安全运算符:

traveler.?visitedCountries.contains("France")

如果 visitedCountries 为 null,则此表达式的计算结果为 null 而不是抛出 NPE。

我的问题是:空安全运算符是否适用于方法调用?例如:

traveler.getVisitedCountries().contains("France")
如果 getVisitedCountries() returns 为空,

将抛出 NullPointerException

但是如果我输入空安全运算符会发生什么?如果字段 visitedCountries 为 null,下面会做什么?

traveler.?getVisitedCountries().contains("France")

事实证明,表达式

traveler.?getVisitedCountries().contains("France")

确实遵守 null 安全运算符。它会在这里评估为 null。单元测试:

@Test
public void testMVELNullSafeOnMethod() throws Exception {
    Traveler traveler = new Traveler();
    // traveler visitedCountries field is null
    String expression = "traveler.?getVisitedCountries().contains(\"France\")";
    Serializable exp = MVEL.compileExpression(expression);
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("traveler", traveler);
    Boolean response = (Boolean) MVEL.executeExpression(exp, map);
    assertNull(response);
}