diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java b/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java index 08bfa0bc7b..16992e2e16 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -79,11 +79,13 @@ public interface BeanWrapper extends ConfigurablePropertyAccessor { PropertyDescriptor getPropertyDescriptor(String propertyName) throws InvalidPropertyException; /** - * Set whether this BeanWrapper should attempt to "auto-grow" a nested path that contains a null value. - *

If "true", a null path location will be populated with a default object value and traversed - * instead of resulting in a {@link NullValueInNestedPathException}. Turning this flag on also - * enables auto-growth of collection elements when accessing an out-of-bounds index. - *

Default is "false" on a plain BeanWrapper. + * Set whether this BeanWrapper should attempt to "auto-grow" a + * nested path that contains a {@code null} value. + *

If {@code true}, a {@code null} path location will be populated + * with a default object value and traversed instead of resulting in a + * {@link NullValueInNestedPathException}. Turning this flag on also enables + * auto-growth of collection elements when accessing an out-of-bounds index. + *

Default is {@code false} on a plain BeanWrapper. */ void setAutoGrowNestedPaths(boolean autoGrowNestedPaths); diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java b/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java index a52df3d978..d59e89a42c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java @@ -871,8 +871,9 @@ public class BeanWrapperImpl extends AbstractPropertyAccessor implements BeanWra } } - private void growCollectionIfNecessary(Collection collection, int index, - String name, PropertyDescriptor pd, int nestingLevel) { + private void growCollectionIfNecessary(Collection collection, int index, String name, + PropertyDescriptor pd, int nestingLevel) { + if (!this.autoGrowNestedPaths) { return; } diff --git a/spring-beans/src/test/java/org/springframework/beans/BeanWrapperTests.java b/spring-beans/src/test/java/org/springframework/beans/BeanWrapperTests.java index 3d1eede171..9af68a7cfd 100644 --- a/spring-beans/src/test/java/org/springframework/beans/BeanWrapperTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/BeanWrapperTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +16,6 @@ package org.springframework.beans; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - import java.beans.PropertyEditorSupport; import java.math.BigDecimal; import java.math.BigInteger; @@ -44,11 +37,16 @@ import java.util.TreeSet; import org.apache.commons.logging.LogFactory; import org.junit.Test; + import org.springframework.beans.factory.annotation.Autowire; import org.springframework.beans.propertyeditors.CustomNumberEditor; import org.springframework.beans.propertyeditors.StringArrayPropertyEditor; import org.springframework.beans.propertyeditors.StringTrimmerEditor; import org.springframework.beans.support.DerivedFromProtectedBaseBean; +import org.springframework.core.convert.ConversionFailedException; +import org.springframework.core.convert.TypeDescriptor; +import org.springframework.core.convert.support.DefaultConversionService; +import org.springframework.core.convert.support.GenericConversionService; import org.springframework.tests.Assume; import org.springframework.tests.TestGroup; import org.springframework.tests.sample.beans.BooleanTestBean; @@ -56,15 +54,10 @@ import org.springframework.tests.sample.beans.ITestBean; import org.springframework.tests.sample.beans.IndexedTestBean; import org.springframework.tests.sample.beans.NumberTestBean; import org.springframework.tests.sample.beans.TestBean; -import org.springframework.core.convert.ConversionFailedException; -import org.springframework.core.convert.TypeDescriptor; -import org.springframework.core.convert.support.DefaultConversionService; -import org.springframework.core.convert.support.GenericConversionService; import org.springframework.util.StopWatch; import org.springframework.util.StringUtils; import static org.hamcrest.Matchers.*; - import static org.junit.Assert.*; /** @@ -1556,28 +1549,37 @@ public final class BeanWrapperTests { @Test public void cornerSpr10115() { Spr10115Bean foo = new Spr10115Bean(); - BeanWrapperImpl bwi = new BeanWrapperImpl(); - bwi.setWrappedInstance(foo); + BeanWrapperImpl bwi = new BeanWrapperImpl(foo); bwi.setPropertyValue("prop1", "val1"); assertEquals("val1", Spr10115Bean.prop1); } @Test - public void testArrayToObject() throws Exception { + public void testArrayToObject() { ArrayToObject foo = new ArrayToObject(); - BeanWrapperImpl bwi = new BeanWrapperImpl(); - bwi.setWrappedInstance(foo); + BeanWrapperImpl bwi = new BeanWrapperImpl(foo); Object[] array = new Object[] {"1","2"}; - bwi.setPropertyValue("object", array ); + bwi.setPropertyValue("object", array); assertThat(foo.getObject(), equalTo((Object) array)); array = new Object[] {"1"}; - bwi.setPropertyValue("object", array ); + bwi.setPropertyValue("object", array); assertThat(foo.getObject(), equalTo((Object) array)); -} + } + + @Test + public void testPropertyTypeMismatch() { + PropertyTypeMismatch foo = new PropertyTypeMismatch(); + BeanWrapperImpl bwi = new BeanWrapperImpl(foo); + bwi.setPropertyValue("object", "a String"); + assertEquals("a String", foo.value); + assertEquals(8, bwi.getPropertyValue("object")); + } + static class Spr10115Bean { + private static String prop1; public static void setProp1(String prop1) { @@ -1962,11 +1964,10 @@ public final class BeanWrapperTests { } - static class ArrayToObject { + public static class ArrayToObject { private Object object; - public void setObject(Object object) { this.object = object; } @@ -1974,6 +1975,20 @@ public final class BeanWrapperTests { public Object getObject() { return object; } - } + + + public static class PropertyTypeMismatch { + + public String value; + + public void setObject(String object) { + this.value = object; + } + + public Integer getObject() { + return (this.value != null ? this.value.length() : null); + } + } + }