Disable array allocation in case of no constructor resolution

Closes gh-28808
This commit is contained in:
Juergen Hoeller 2022-10-18 18:59:37 +02:00
parent 311048726e
commit a3a48a241c
2 changed files with 21 additions and 3 deletions

View File

@ -243,6 +243,12 @@ public class ConstructorReference extends SpelNodeImpl {
intendedArrayType != null ? intendedArrayType.getClass() : null)); intendedArrayType != null ? intendedArrayType.getClass() : null));
} }
if (state.getEvaluationContext().getConstructorResolvers().isEmpty()) {
// No constructor resolver -> no array construction either (as of 6.0)
throw new SpelEvaluationException(getStartPosition(), SpelMessage.CONSTRUCTOR_NOT_FOUND,
type + "[]", "[]");
}
Class<?> componentType; Class<?> componentType;
TypeCode arrayTypeCode = TypeCode.forName(type); TypeCode arrayTypeCode = TypeCode.forName(type);
if (arrayTypeCode == TypeCode.OBJECT) { if (arrayTypeCode == TypeCode.OBJECT) {

View File

@ -18,17 +18,21 @@ package org.springframework.expression.spel;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression; import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.SimpleEvaluationContext;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
/** /**
* Test construction of arrays. * Test construction of arrays.
* *
* @author Andy Clement * @author Andy Clement
* @author Sam Brannen * @author Sam Brannen
* @author Juergen Hoeller
*/ */
class ArrayConstructorTests extends AbstractExpressionTests { class ArrayConstructorTests extends AbstractExpressionTests {
@ -97,7 +101,7 @@ class ArrayConstructorTests extends AbstractExpressionTests {
void typeArrayConstructors() { void typeArrayConstructors() {
evaluate("new String[]{'a','b','c','d'}[1]", "b", String.class); evaluate("new String[]{'a','b','c','d'}[1]", "b", String.class);
evaluateAndCheckError("new String[]{'a','b','c','d'}.size()", SpelMessage.METHOD_NOT_FOUND, 30, "size()", evaluateAndCheckError("new String[]{'a','b','c','d'}.size()", SpelMessage.METHOD_NOT_FOUND, 30, "size()",
"java.lang.String[]"); "java.lang.String[]");
evaluate("new String[]{'a','b','c','d'}.length", 4, Integer.class); evaluate("new String[]{'a','b','c','d'}.length", 4, Integer.class);
} }
@ -110,10 +114,18 @@ class ArrayConstructorTests extends AbstractExpressionTests {
void multiDimensionalArrays() { void multiDimensionalArrays() {
evaluate("new String[2][2]", "[Ljava.lang.String;[2]{[2]{null,null},[2]{null,null}}", String[][].class); evaluate("new String[2][2]", "[Ljava.lang.String;[2]{[2]{null,null},[2]{null,null}}", String[][].class);
evaluate("new String[3][2][1]", evaluate("new String[3][2][1]",
"[[Ljava.lang.String;[3]{[2]{[1]{null},[1]{null}},[2]{[1]{null},[1]{null}},[2]{[1]{null},[1]{null}}}", "[[Ljava.lang.String;[3]{[2]{[1]{null},[1]{null}},[2]{[1]{null},[1]{null}},[2]{[1]{null},[1]{null}}}",
String[][][].class); 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) { private void evaluateArrayBuildingExpression(String expression, String expectedToString) {
SpelExpressionParser parser = new SpelExpressionParser(); SpelExpressionParser parser = new SpelExpressionParser();
Expression e = parser.parseExpression(expression); Expression e = parser.parseExpression(expression);