Spring 游戏 collection 投影

Spring SPEL collection projection

一个关于 SPEL collection 选择的简单问题。

查看第 10.5.17 节 Collection 选择此页 https://docs.spring.io/spring/docs/4.3.10.RELEASE/spring-framework-reference/html/expressions.html

List<Inventor> list = (List<Inventor>) parser.parseExpression(
        "Members.?[Nationality == 'Serbian']").getValue(societyContext);

我需要的是来自外部的选择 'Serbian' 而不是固定的硬编码字符串。

只是为了论证考虑,我们可以从 link 的同一页面中将其作为来自同一社会 class 的“selectedNationality” .

修改后 class 选择国籍

public class Society {
    private String name;
    public static String Advisors = "advisors";
    public static String President = "president";
    private List<Inventor> members = new ArrayList<Inventor>();
    private Map officers = new HashMap();
// new selector field
    private String selectedNationality;
......
 }

新选择

新选择的 SPEL 看起来像

List<Inventor> list = (List<Inventor>) parser.parseExpression(
        "Members.?[Nationality == selectedNationality]").getValue(societyContext);

当我们尝试时,错误是“selectedNationality”不是会员的一部分object。

这是否意味着对于 spring 表达式语言中的 collection 选择,我们需要硬编码字符串?如果是,有人知道为什么吗?

了解如何操作。所以方法是使用变量 参见 10.5.11 变量 @ [https://docs.spring.io/spring/docs/4.3.10.RELEASE/spring-framework-reference/html/expressions.html][1]

设置变量

所以在我们的例子中,我们将设置变量:

Inventor tesla = new Inventor("Nikola Tesla", "Serbian");
StandardEvaluationContext context = new StandardEvaluationContext(tesla);
context.setVariable("selectedNationality ", "Serbian");

新选择

新的选择 SPEL 看起来像这样 #selectedNationality

List<Inventor> list = (List<Inventor>) parser.parseExpression(
        "Members.?[Nationality == #selectedNationality]").getValue(societyContext);

很有魅力!