Disable array allocation in case of no constructor resolution
Closes gh-28808
This commit is contained in:
parent
311048726e
commit
a3a48a241c
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue