gpt4 book ai didi

Spring SpEL 选择了错误的方法来调用

转载 作者:搜寻专家 更新时间:2023-11-01 03:50:50 27 4
gpt4 key购买 nike

我正在尝试计算以下 SpEL 表达式(Spring 表达式版本 3.1.1):

T(com.google.common.collect.Lists).newArrayList(#iterable)

#iterable 的类型是 java.lang.Iterable。Google Guava com.google.common.collect.Lists(版本 14.0)确实有一个方法 newArrayList(Iterable) 但出于某种原因 SpEL 选择调用不同的方法:newArrayList(Object[] )

我深入研究了代码,发现问题出在 org.springframework.expression.spel.support.ReflectiveMethodResolver 实现上:它似乎对方法按java.lang.Class::getMethods。如果 2 个方法与调用匹配(在其中一个方法是可变参数的情况下),将调用后面的方法(按顺序),而不是选择不是可变参数的方法(更具体)。似乎 JDK 不保证方法的排序顺序:不同的运行显示不同的顺序。

有没有办法解决这个问题?

最佳答案

可以使用Spring EL的collection projections从iterable中select all并转换成list:

"#iterable.?[true]"

一个简单的测试例子:

Iterable<Integer> it = () -> new Iterator<Integer>() {

private int[] a = new int[]{1, 2, 3};
private int index = 0;

@Override
public boolean hasNext() {
return index < a.length;
}

@Override
public Integer next() {
return a[index++];
}
};
Tmp tmp = new Tmp();
tmp.setO(it);
StandardEvaluationContext context = new StandardEvaluationContext(tmp);

ArrayList<Integer> list = parser.parseExpression("o.?[true]").getValue(context,
ArrayList.class);

关于Spring SpEL 选择了错误的方法来调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28924430/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com