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表达式变得越来越复杂,我强烈建议将该表达式移动到静态方法,并使用。在引用静态方法时,不要忘记包含完全限定的包名