Работает ли оператор MVEL Null-Safe с методами?

У меня есть вопрос относительно оператора MVEL null-safe (?).

Скажем, у меня есть следующий класс Java:

public class Traveler {

    private Set<String> visitedCountries;

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

Если у меня есть такое выражение MVEL:

traveler.visitedCountries.contains("France")

Я получаю NullPointerException, если поле visitedCountries пустое. Чтобы обойти это, я могу использовать null-safe оператор:

traveler.?visitedCountries.contains("France")

Если visitedCountries равно null, это выражение оценивается как null вместо создания NPE.

Мой вопрос таков: работает ли нулевой безопасный оператор при вызовах методов? Например:

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

выдаст NullPointerException, если getVisitedCountries() вернет null.

Но что произойдет, если я вставлю null-safe оператор? Что будет делать следующее, если поле visitedCountries пустое?

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

person Mark    schedule 13.09.2017    source источник


Ответы (1)


Как оказалось, выражение

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

соблюдает нулевой безопасный оператор. Здесь он будет равен нулю. Модульный тест:

@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);
}
person Mark    schedule 13.09.2017