这会起作用的
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]);
}发布于 2020-11-08 17:20:18
尽管Java可以在SPeL表达式中使用,但SPeL本身是一种单独的语言,并不完全支持Java语言。来自文档
SpEL基于一种与技术无关的API,允许在需要时集成其他表达式语言实现。
若要对SPeL表达式中的列表执行筛选和映射操作,请分别使用藏书选择和集合投影:
集合选择示例
// Java:
configList.stream().filter(o -> o.getRuleId() > 2).collect(Collectors.toList())
// SPeL (notice the question mark) :
"#configList.?[ruleId>2]"集合投影示例
// Java:
configList.stream().map(o -> o.getRuleId()).collect(Collectors.toList())
// SPeL (notice the exclamation mark) :
"#configList.![ruleId]"我举了一个小例子来说明这一点:
public class So64738543ExpressionTest {
public static class RuleItem {
private int ruleId;
public RuleItem(int ruleId) {
this.ruleId = ruleId;
}
public int getRuleId() {
return ruleId;
}
}
@Test
public void collectionProjection() {
List<RuleItem> ruleItems = Arrays.asList(new RuleItem(1), new RuleItem(2), new RuleItem(3));
EvaluationContext context = new StandardEvaluationContext(ruleItems);
Expression expression = new SpelExpressionParser().parseExpression("#root.![ruleId]");
Assert.assertEquals(Arrays.asList(1,2,3), expression.getValue(context));
}
}编辑
此外,如果SPeL表达式变得越来越复杂,我强烈建议将表达式移动到静态方法并使用T operator调用它。在引用静态方法时,不要忘记包含完全限定的包名。
https://stackoverflow.com/questions/64738543
复制相似问题