2011-11-09 53 views
1

6.5.14 The Elvis Operator埃爾維斯運營商春季表達語言(SpEL)

我看到一些在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。

(使用彈簧框架-3.0.5)

回答

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是嵌套操作符在表達式樹的視圖中。

希望這會有所幫助。