Spring SpEL解析参数时使用“引用”;Collectors.toList();源源不断';你不能像expressionString那样工作吗?
这会奏效的Spring SpEL解析参数时使用“引用”;Collectors.toList();源源不断';你不能像expressionString那样工作吗?,spring,java-8,spring-el,Spring,Java 8,Spring El,这会奏效的 parser.parseExpression("#configList.stream().toArray()").getValue(context) 但以下情况不会发生 parser.parseExpression("#configList.stream().map(o -> o.ruleId).collect(Collectors.toList())").getValue(context) F.Y.I上下文的构造如下:
parser.parseExpression("#configList.stream().toArray()").getValue(context)
但以下情况不会发生
parser.parseExpression("#configList.stream().map(o -> o.ruleId).collect(Collectors.toList())").getValue(context)
F.Y.I上下文的构造如下:
Object[] args = joinPoint.getArgs();
Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
String[] params = discoverer.getParameterNames(method);
EvaluationContext context = new StandardEvaluationContext();
for (int i = 0; i < params.length; i++) {
context.setVariable(params[i], args[i]);
}
Object[]args=joinPoint.getArgs();
方法Method=((MethodSignature)joinPoint.getSignature()).getMethod();
字符串[]params=discoverer.getParameterNames(方法);
EvaluationContext=新标准EvaluationContext();
对于(int i=0;i
尽管可以在SPeL表达式中使用Java,但SPeL本身是一种独立的语言,并不完全支持Java语言。从:
SpEL基于技术无关的API,允许在需要时集成其他表达式语言实现
要对SPeL表达式中的列表执行筛选和映射操作,请分别使用和:
集合选择示例
//Java:
configList.stream().filter(o->o.getRuleId()>2.collect(Collectors.toList())
//SPeL(注意问号):
“#配置列表.?[ruleId>2]”
集合投影示例
//Java:
configList.stream().map(o->o.getRuleId()).collect(Collectors.toList())
//SPeL(请注意感叹号):
“#配置列表![ruleId]”
我举了一个小例子来说明这一点:
公共类SO64738543表达式测试{
公共静态类RuleItem{
私有int-ruleId;
公共规则项(int ruleId){
this.ruleId=ruleId;
}
public int getRuleId(){
返回规则ID;
}
}
@试验
公共无效集合投影(){
List ruleItems=Arrays.asList(新规则项(1)、新规则项(2)、新规则项(3));
EvaluationContext=新标准EvaluationContext(规则项);
Expression Expression=new SpelExpressionParser().parseExpression(“#root.![ruleId]”);
Assert.assertEquals(Arrays.asList(1,2,3),expression.getValue(context));
}
}
[编辑]
此外,如果SPeL表达式变得越来越复杂,我强烈建议将该表达式移动到静态方法,并使用。在引用静态方法时,不要忘记包含完全限定的包名。尽管可以在SPeL表达式中使用Java,但SPeL本身是一种独立的语言,不完全支持Java语言。从: SpEL基于技术无关的API,允许在需要时集成其他表达式语言实现 要对SPeL表达式中的列表执行筛选和映射操作,请分别使用和: 集合选择示例
//Java:
configList.stream().filter(o->o.getRuleId()>2.collect(Collectors.toList())
//SPeL(注意问号):
“#配置列表.?[ruleId>2]”
集合投影示例
//Java:
configList.stream().map(o->o.getRuleId()).collect(Collectors.toList())
//SPeL(请注意感叹号):
“#配置列表![ruleId]”
我举了一个小例子来说明这一点:
公共类SO64738543表达式测试{
公共静态类RuleItem{
私有int-ruleId;
公共规则项(int ruleId){
this.ruleId=ruleId;
}
public int getRuleId(){
返回规则ID;
}
}
@试验
公共无效集合投影(){
List ruleItems=Arrays.asList(新规则项(1)、新规则项(2)、新规则项(3));
EvaluationContext=新标准EvaluationContext(规则项);
Expression Expression=new SpelExpressionParser().parseExpression(“#root.![ruleId]”);
Assert.assertEquals(Arrays.asList(1,2,3),expression.getValue(context));
}
}
[编辑]
此外,如果SPeL表达式变得越来越复杂,我强烈建议将该表达式移动到静态方法,并使用。在引用静态方法时,不要忘记包含完全限定的包名