Browse Source

Fix MethodBasedEvaluationContext.lazyLoadArguments

This commit fix a potential `ArrayIndexOutOfBoundsException` if
`lazyLoadArguments` is called with an empty variable argument.

See gh-1070
pull/1405/head
spodgurskiy 10 years ago committed by Stephane Nicoll
parent
commit
aaa223ae66
  1. 2
      spring-context/src/main/java/org/springframework/context/expression/MethodBasedEvaluationContext.java
  2. 39
      spring-context/src/test/java/org/springframework/context/expression/MethodBasedEvaluationContextTests.java

2
spring-context/src/main/java/org/springframework/context/expression/MethodBasedEvaluationContext.java

@ -89,7 +89,7 @@ public class MethodBasedEvaluationContext extends StandardEvaluationContext { @@ -89,7 +89,7 @@ public class MethodBasedEvaluationContext extends StandardEvaluationContext {
String[] parameterNames = this.paramDiscoverer.getParameterNames(this.method);
// save parameter names (if discovered)
if (parameterNames != null) {
for (int i = 0; i < parameterNames.length; i++) {
for (int i = 0; i < args.length; i++) {
setVariable(parameterNames[i], this.args[i]);
}
}

39
spring-context/src/test/java/org/springframework/context/expression/MethodBasedEvaluationContextTests.java

@ -62,6 +62,42 @@ public class MethodBasedEvaluationContextTests { @@ -62,6 +62,42 @@ public class MethodBasedEvaluationContextTests {
assertNull(context.lookupVariable("p0"));
}
@Test
public void varArgEmpty() {
Method method = ReflectionUtils.findMethod(SampleMethods.class, "hello", Boolean.class, String[].class);
MethodBasedEvaluationContext context = createEvaluationContext(method, new Object[] {null});
assertNull(context.lookupVariable("p0"));
assertNull(context.lookupVariable("p1"));
}
@Test
public void varArgNull() {
Method method = ReflectionUtils.findMethod(SampleMethods.class, "hello", Boolean.class, String[].class);
MethodBasedEvaluationContext context = createEvaluationContext(method, new Object[] {null, null});
assertNull(context.lookupVariable("p0"));
assertNull(context.lookupVariable("p1"));
}
@Test
public void varArgSingle() {
Method method = ReflectionUtils.findMethod(SampleMethods.class, "hello", Boolean.class, String[].class);
MethodBasedEvaluationContext context = createEvaluationContext(method, new Object[] {null, "hello"});
assertNull(context.lookupVariable("p0"));
assertEquals("hello", context.lookupVariable("p1"));
}
@Test
public void varArgMultiple() {
Method method = ReflectionUtils.findMethod(SampleMethods.class, "hello", Boolean.class, String[].class);
MethodBasedEvaluationContext context = createEvaluationContext(method, new Object[] {null, new String[]{"hello", "hi"}});
assertNull(context.lookupVariable("p0"));
assertNotNull(context.lookupVariable("p1"));
}
private MethodBasedEvaluationContext createEvaluationContext(Method method, Object[] args) {
return new MethodBasedEvaluationContext(this, method, args, this.paramDiscover);
}
@ -73,6 +109,9 @@ public class MethodBasedEvaluationContextTests { @@ -73,6 +109,9 @@ public class MethodBasedEvaluationContextTests {
private void hello(String foo, Boolean flag) {
}
private void hello(Boolean flag, String ... vararg){
}
}
}
Loading…
Cancel
Save