gpt4 book ai didi

spring-el - 如何使用 Spring 表达式语言将没有构造函数的对象添加到列表中

转载 作者:行者123 更新时间:2023-12-02 16:35:34 26 4
gpt4 key购买 nike

我想使用 Spring 表达式语言将 BigDecimal 添加到列表中。

public class SpelTest {

public List<BigDecimal> values;

StandardEvaluationContext context;
SpelExpressionParser parser;

@Before
public void setup() {
values = new ArrayList<>();
context = new StandardEvaluationContext(this);
parser = new SpelExpressionParser(new SpelParserConfiguration(true, true));
}

@Test
public void shouldChangeValue() {
values.add(BigDecimal.ONE);

parser.parseExpression("values[0]").setValue(context, "123.4");

assertThat(values.get(0)).isEqualTo(BigDecimal.valueOf(123.4)); // passes
}

@Test
public void shouldAddValue() {
parser.parseExpression("values[0]").setValue(context, "123.4");

assertThat(values.get(0)).isEqualTo(BigDecimal.valueOf(123.4)); // fails
}
}

更改第一个条目通过但添加条目失败

Caused by: java.lang.NoSuchMethodException: java.math.BigDecimal.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3349)
at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2553)
at org.springframework.util.ReflectionUtils.accessibleConstructor(ReflectionUtils.java:185)
at org.springframework.expression.spel.ast.Indexer$CollectionIndexingValueRef.growCollectionIfNecessary(Indexer.java:715)
... 55 more

不确定为什么当列表为空时 SpEL 无法正确初始化 BigDecimal。令人惊讶的是,我没有发现任何关于这个问题的信息。

感谢您的帮助!

最佳答案

问题是您在 SpelParserConfiguraion 上激活了 autoGrowCollections。因此,如果您尝试使用索引运算符 [] 访问集合中不存在的元素,它会尝试使用默认构造函数创建元素。 BigDecimal 没有默认构造函数,因此失败。

您可以做的是在 SpEL 本身中创建对象。例如:

    @Test
public void shouldAddValue() {
parser.parseExpression("values.add(0, new java.math.BigDecimal(\"123.4\"))").getValue(context);

assertThat(values.size() > 0);
assertThat(values.get(0)).isEqualTo(BigDecimal.valueOf(123.4));
}

或者你可以创建一个 BigDecimal 的子类,它有一个默认的构造函数并使用这个类。

关于spring-el - 如何使用 Spring 表达式语言将没有构造函数的对象添加到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62771421/

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