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
指定。
我正在尝试使用变量作为键来查找地图中的值。我希望能够直接引用变量(在本例中为 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
指定。