Spring表达式语言(SpEL)中的Elvis运算符

时间:2011-11-09 10:21:37

标签: java spring-el

6.5.14 The Elvis Operator

我在SpEL中使用elvis运算符看到了一些trange行为。如果我不在括号“()”中包围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

奇怪的部分是当值不在hashmap中时(即注释facts.put行),elvis运算符似乎工作正常,两个表达式都按预期返回false。

(使用spring-framework-3.0.5)

1 个答案:

答案 0 :(得分:2)

我认为您需要将您的示例扩展到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是表达式树视图中的嵌套运算符。

希望这有帮助。