Оператор Элвиса в Spring Expression Language (SpEL) - PullRequest
1 голос
/ 09 ноября 2011

6.5.14. Оператор Элвиса

Я наблюдаю некоторое странное поведение с использованием оператора elvis в SpEL. Если я не заключаю выражение elvis в скобки "()", то возвращается результат оператора elvis, а остальная часть выражения игнорируется. Пример кода, показывающий поведение ниже:

    HashMap<String, String> facts = new HashMap<String, String>();
    facts.put("flag", "flagvalue");
    String expressionString;
    Expression expression;
    Object expressionResult;

    expressionString = "[flag]?:'' matches '(?i)flagvalue'";
    expression = new SpelExpressionParser().parseExpression(expressionString);
    expressionResult = expression.getValue(facts);
    System.out.println("Unexpected Result:" + expressionResult);

    expressionString = "([flag]?:'') matches '(?i)flagvalue'";
    expression = new SpelExpressionParser().parseExpression(expressionString);
    expressionResult = expression.getValue(facts);
    System.out.println("Expected Result:" + expressionResult);

Выход:

    Unexpected Result:flagvalue
    Expected Result:true

Странная часть - когда значение отсутствует в хэш-карте (т. Е. Комментарий в строке facts.put), оператор elvis работает нормально, и оба выражения возвращают false, как и ожидалось.

(с использованием spring-framework-3.0.5)

1 Ответ

2 голосов
/ 15 марта 2012

Я думаю, вам нужно расширить ваш пример до выражения Java, чтобы понять разницу, которая будет выглядеть следующим образом:

System.out.println(facts.containsKey("flag") ? facts.get("flag") : "".matches("(?i)flagvalue"))
System.out.println((facts.containsKey("flag") ? facts.get("flag") : "").matches("(?i)flagvalue"))

, которая печатает

flagvalue
true

У меня нетЯ заглянул внутрь реализации, но я предполагаю, что '' matches '(?i)flagvalue' сначала будет оцениваться, потому что matches является вложенным оператором в представлении дерева выражений.

Надеюсь, это поможет.

...