Spring 表达式语言:使用变量作为 SpEL 中映射查找的键

Spring expression language: Using a variable as key for a map lookup in SpEL

我正在尝试使用变量作为键来查找地图中的值。我希望能够直接引用变量(在本例中为 jobTitle),但出于某种原因,我需要在变量前加上 #root.#this. 前缀才能获取它上班。所以这有效:

parser.parseExpression("{ \"Manager\":\"37.5\", \"CEO\":\"40\"}[#root.jobTitle]"

(解析为“37.5”)

但这不是

parser.parseExpression("{ \"Manager\":\"37.5\", \"CEO\":\"40\"}[jobTitle]"

(解析为空)

jobTitle 是上下文对象的根属性。通过查看 SpEL 文档,我似乎应该能够直接引用该属性?我做错了什么吗?

下面是完整的工作代码

public static void main(String[] args) {
    ExpressionParser parser = new SpelExpressionParser();
    Employee employee = new Employee("Joe Bloggs", "Manager");
    Expression exp = parser.parseExpression(
            "{ \"Manager\":\"37.5\", \"Ceo\":\"40\"}[#root.jobTitle]");
    StandardEvaluationContext context = new StandardEvaluationContext(employee);
    context.setRootObject(employee);
    System.out.println(exp.getValue(context, String.class));
}

static class Employee {
    private String firstName;
    private String jobTitle;

    Employee(String firstName, String jobTitle) {
        this.firstName = firstName;
        this.jobTitle = jobTitle;
    }

    public String getJobTitle() {
        return jobTitle;
    }
}

From looking at the SpEL docs it seems like I should be able to reference the attribute directly?

这对于以下情况是正确的,两者都将打印“Manager”

System.out.println(parser.parseExpression("#root.jobTitle").getValue(context, String.class));
System.out.println(parser.parseExpression("jobTitle").getValue(context, String.class));

但是对于[]里面的表达式,处理是不同的。由于 SpEL 没有语言规范,我只能根据行为进行解释。 当你 运行

System.out.println(parser.parseExpression(
           "{\"jobTitle\":\"37.5\"}[jobTitle]").getValue(context, String.class));

这实际上会打印“37.5”([jobTitle] 被视为 [\"jobTitle\"])。作者决定更方便地访问 Map 的值,缺点是在引用根对象时需要用 #root.jobTitle 指定。