diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java index 5e601f356c1..c9a68578ae0 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java @@ -243,6 +243,12 @@ public class ConstructorReference extends SpelNodeImpl { 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; TypeCode arrayTypeCode = TypeCode.forName(type); if (arrayTypeCode == TypeCode.OBJECT) { diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/ArrayConstructorTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/ArrayConstructorTests.java index 252e532e748..7d9606f88fb 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/ArrayConstructorTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/ArrayConstructorTests.java @@ -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 { @@ -97,7 +101,7 @@ class ArrayConstructorTests extends AbstractExpressionTests { void typeArrayConstructors() { 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()", - "java.lang.String[]"); + "java.lang.String[]"); evaluate("new String[]{'a','b','c','d'}.length", 4, Integer.class); } @@ -110,10 +114,18 @@ class ArrayConstructorTests extends AbstractExpressionTests { void multiDimensionalArrays() { evaluate("new String[2][2]", "[Ljava.lang.String;[2]{[2]{null,null},[2]{null,null}}", String[][].class); 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}}}", - String[][][].class); + "[[Ljava.lang.String;[3]{[2]{[1]{null},[1]{null}},[2]{[1]{null},[1]{null}},[2]{[1]{null},[1]{null}}}", + 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);