SpEL で elvis 演算子を使用すると、奇妙な動作が見られます。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 を使用)