Spel中的#root和#this

use*_*692 7 java spring spring-el

在春季3规划环境地政司,#this#root进行了介绍.

始终定义变量#root并引用根上下文对象.虽然#this可能会随着表达式的组件的评估而变化,但#root始终引用根.

我已经阅读了文档,但我仍然不明白是什么#root意思(没有例子).有人可以举个例子吗?

Kon*_*kov 8

假设我们有以下代码片段,它用几个素数填充列表并将其定义为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);
Run Code Online (Sandbox Code Playgroud)

现在,如果我们想要缩小列表并获得大于10的所有素数,我们可以使用?[]选择运算符.声明是这样的:

Expression expression = parser.parseExpression("#primes.?[#this>10]");
List<Integer> primesGreaterThanTen = (List<Integer>) expression.getValue(ctx);
Run Code Online (Sandbox Code Playgroud)

如您所见,要评估的表达式是#primes.?[#this > 10].它是如何工作的 ?

  • #primes指的是primes清单.
  • ?[]选择运营商的每一个对象匹配iprimes其列表不为空,在括号中给出,并且符合标准.在我们的例子中,标准是#this > 10.#this指的是当前的评估对象,在我们的示例中,该对象来自列表中对象,此时正在检查对象是否为null且> 10.

评估结果将是一个列表,其中包含:

[11, 13, 17]
Run Code Online (Sandbox Code Playgroud)

SpEL上下文可以有一个#root变量.我们有这个简单的类:

public class SomeCustomObject {
    public int stringLength(String input) {
        if (input == null) return 0;
        return input.length();
    }
}
Run Code Online (Sandbox Code Playgroud)

并将我们的实例定义SomeCustomObject#root变量.

SomeCustomObject someObject = new SomeCustomObject();
context.setRootObject(someObject);
Run Code Online (Sandbox Code Playgroud)

这将为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);
Run Code Online (Sandbox Code Playgroud)

result变量将被评估为true.

这是什么力量#root

通过单个根对象,您可以向表达式公开全面的自定义环境,例如自定义实用程序方法和/或变量.

更多信息: