diff --git a/spring-context/src/main/java/org/springframework/validation/DataBinder.java b/spring-context/src/main/java/org/springframework/validation/DataBinder.java index 556c4a51386..d32ca6fe790 100644 --- a/spring-context/src/main/java/org/springframework/validation/DataBinder.java +++ b/spring-context/src/main/java/org/springframework/validation/DataBinder.java @@ -95,6 +95,7 @@ import org.springframework.util.StringUtils; * @author Juergen Hoeller * @author Rob Harrop * @author Stephane Nicoll + * @author Kazuki Shimizu * @see #setAllowedFields * @see #setRequiredFields * @see #registerCustomEditor @@ -213,8 +214,12 @@ public class DataBinder implements PropertyEditorRegistry, TypeConverter { * Specify the limit for array and collection auto-growing. *

Default is 256, preventing OutOfMemoryErrors in case of large indexes. * Raise this limit if your auto-growing needs are unusually high. + * @see #initBeanPropertyAccess() + * @see org.springframework.beans.BeanWrapper#setAutoGrowCollectionLimit */ public void setAutoGrowCollectionLimit(int autoGrowCollectionLimit) { + Assert.state(this.bindingResult == null, + "DataBinder is already initialized - call setAutoGrowCollectionLimit before other configuration methods"); this.autoGrowCollectionLimit = autoGrowCollectionLimit; } diff --git a/spring-context/src/test/java/org/springframework/validation/DataBinderTests.java b/spring-context/src/test/java/org/springframework/validation/DataBinderTests.java index c34c0a1fbe2..fb10d9dbbf2 100644 --- a/spring-context/src/test/java/org/springframework/validation/DataBinderTests.java +++ b/spring-context/src/test/java/org/springframework/validation/DataBinderTests.java @@ -36,8 +36,10 @@ import java.util.Optional; import java.util.Set; import java.util.TreeSet; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.springframework.beans.InvalidPropertyException; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.NotWritablePropertyException; @@ -69,9 +71,13 @@ import static org.junit.Assert.*; * @author Rod Johnson * @author Juergen Hoeller * @author Rob Harrop + * @author Kazuki Shimizu */ public class DataBinderTests { + @Rule + public ExpectedException expectedException = ExpectedException.none(); + @Test public void testBindingNoErrors() throws Exception { TestBean rod = new TestBean(); @@ -1982,6 +1988,30 @@ public class DataBinderTests { assertEquals("age", binder.getBindingResult().getFieldError("age").getField()); } + @Test // SPR-14888 + public void testSetAutoGrowCollectionLimit() { + BeanWithIntegerList tb = new BeanWithIntegerList(); + DataBinder binder = new DataBinder(tb); + binder.setAutoGrowCollectionLimit(257); + MutablePropertyValues pvs = new MutablePropertyValues(); + pvs.add("integerList[256]", "1"); + + binder.bind(pvs); + assertEquals(257, tb.getIntegerList().size()); + assertEquals(Integer.valueOf(1), tb.getIntegerList().get(256)); + assertEquals(Integer.valueOf(1), binder.getBindingResult().getFieldValue("integerList[256]")); + } + + @Test // SPR-14888 + public void testSetAutoGrowCollectionLimitAfterInitialization() { + + expectedException.expect(IllegalStateException.class); + expectedException.expectMessage("DataBinder is already initialized - call setAutoGrowCollectionLimit before other configuration methods"); + + DataBinder binder = new DataBinder(new BeanWithIntegerList()); + binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); + binder.setAutoGrowCollectionLimit(257); + } @SuppressWarnings("unused") private static class BeanWithIntegerList {