Disable array allocation in case of no constructor resolution

See gh-28808
Closes gh-33386

(cherry picked from commit a3a48a241c)
This commit is contained in:
Juergen Hoeller
2024-08-14 10:02:59 +03:00
committed by Sam Brannen
parent f00bc7bb24
commit f44d13cb78
2 changed files with 24 additions and 5 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -268,6 +268,13 @@ public class ConstructorReference extends SpelNodeImpl {
}
String type = (String) intendedArrayType;
if (state.getEvaluationContext().getConstructorResolvers().isEmpty()) {
// No constructor resolver -> no array construction either (as of 5.3.38)
throw new SpelEvaluationException(getStartPosition(), SpelMessage.CONSTRUCTOR_NOT_FOUND,
type + "[]", "[]");
}
Class<?> componentType;
TypeCode arrayTypeCode = TypeCode.forName(type);
if (arrayTypeCode == TypeCode.OBJECT) {
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,17 +18,21 @@ package org.springframework.expression.spel;
import org.junit.jupiter.api.Test;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.SimpleEvaluationContext;
import org.springframework.util.ObjectUtils;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
/**
* Test construction of arrays.
*
* @author Andy Clement
* @author Sam Brannen
* @author Juergen Hoeller
*/
class ArrayConstructorTests extends AbstractExpressionTests {
@@ -114,6 +118,14 @@ class ArrayConstructorTests extends AbstractExpressionTests {
String[][][].class);
}
@Test
void noArrayConstruction() {
EvaluationContext context = SimpleEvaluationContext.forReadWriteDataBinding().build();
assertThatExceptionOfType(SpelEvaluationException.class).isThrownBy(() ->
parser.parseExpression("new int[2]").getValue(context));
}
private void evaluateArrayBuildingExpression(String expression, String expectedToString) {
SpelExpressionParser parser = new SpelExpressionParser();
Expression e = parser.parseExpression(expression);