9

Spring 3 SpEL で#this導入#rootされました。

変数 #root は常に定義され、ルート コンテキスト オブジェクトを参照します。#this は、式の構成要素が評価されるときに異なる場合がありますが、#root は常にルートを参照します。

ドキュメントを確認しましたが、意味がわかりません#root(例がありません)。誰かが私に例を教えてもらえますか?

4

2 に答える 2

12

リストをいくつかの素数で埋め、それを 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ですか?

単一のルート オブジェクトを通じて、カスタム ユーティリティ メソッドや変数など、包括的なカスタム環境を式に公開できます。

より詳しい情報:

于 2013-10-23T19:57:49.070 に答える