Spring 3 SpEL で#this
導入#root
されました。
変数 #root は常に定義され、ルート コンテキスト オブジェクトを参照します。#this は、式の構成要素が評価されるときに異なる場合がありますが、#root は常にルートを参照します。
ドキュメントを確認しましたが、意味がわかりません#root
(例がありません)。誰かが私に例を教えてもらえますか?
リストをいくつかの素数で埋め、それを SpEL コンテキストの変数として定義する次のコード スニペットがあるとします。
// create an array of integers
List<Integer> primes = new ArrayList<Integer>();
primes.addAll(Arrays.asList(2,3,5,7,11,13,17));
// create parser and set variable 'primes' as the array of integers
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext ctx = new StandardEvaluationContext();
ctx.setVariable("primes", primes);
ここで、リストを絞り込んで 10 より大きいすべての素数を取得する場合は、?[]
選択演算子を使用できます。ステートメントは次のようになります。
Expression expression = parser.parseExpression("#primes.?[#this>10]");
List<Integer> primesGreaterThanTen = (List<Integer>) expression.getValue(ctx);
ご覧のとおり、評価される式は です#primes.?[#this > 10]
。それはどのように機能しますか?
#primes
リストを参照しprimes
ます。?[]
選択演算子は、null ではなく、括弧で指定された基準に一致するリストi
内のすべてのオブジェクトに一致します。この例では、基準はです。現在の評価オブジェクトを参照します。この例では、現時点で not-null および > 10 についてチェックされているリストのオブジェクトになります。primes
#this > 10
#this
評価の結果は、以下を含むリストになります。
[11, 13, 17]
SpEL コンテキストには#root
変数を含めることができます。この単純なクラスを用意しましょう:
public class SomeCustomObject {
public int stringLength(String input) {
if (input == null) return 0;
return input.length();
}
}
our のインスタンスを変数SomeCustomObject
として定義します。#root
SomeCustomObject someObject = new SomeCustomObject();
context.setRootObject(someObject);
これによりsomeObject
、SpEL コンテキストのルート オブジェクトである変数が作成されます。
#root
変数を使用した簡単な例。
String name = "kocko";
ctx.setVariable("name", kocko);
String statement = "#root.stringLength(#kocko) == 5";
Expression expression = parser.parseExpression(statement);
boolean result = expression.getValue(context, Boolean.class);
result
変数は として評価されますtrue
。
の力は何#root
ですか?
単一のルート オブジェクトを通じて、カスタム ユーティリティ メソッドや変数など、包括的なカスタム環境を式に公開できます。
より詳しい情報: