diff --git a/org.springframework.core/src/main/java/org/springframework/core/convert/service/CollectionToArray.java b/org.springframework.core/src/main/java/org/springframework/core/convert/service/CollectionToArray.java index 439ea771c97..fc557309bdc 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/convert/service/CollectionToArray.java +++ b/org.springframework.core/src/main/java/org/springframework/core/convert/service/CollectionToArray.java @@ -50,17 +50,15 @@ class CollectionToArray extends AbstractCollectionConverter { int i = 0; ConversionExecutor elementConverter = getElementConverter(collection); for (Iterator it = collection.iterator(); it.hasNext(); i++) { - Object value = it.next(); - value = elementConverter.execute(value); - Array.set(array, i, value); + Array.set(array, i, elementConverter.execute(it.next())); } return array; } - private ConversionExecutor getElementConverter(Collection target) { + private ConversionExecutor getElementConverter(Collection source) { ConversionExecutor elementConverter = getElementConverter(); - if (elementConverter == NoOpConversionExecutor.INSTANCE && !target.isEmpty()) { - Iterator it = target.iterator(); + if (elementConverter == NoOpConversionExecutor.INSTANCE && !source.isEmpty()) { + Iterator it = source.iterator(); while (it.hasNext()) { Object value = it.next(); if (value != null) { diff --git a/org.springframework.core/src/main/java/org/springframework/core/convert/service/CollectionToCollection.java b/org.springframework.core/src/main/java/org/springframework/core/convert/service/CollectionToCollection.java index a37720024ee..ea7f15966c0 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/convert/service/CollectionToCollection.java +++ b/org.springframework.core/src/main/java/org/springframework/core/convert/service/CollectionToCollection.java @@ -37,26 +37,29 @@ class CollectionToCollection extends AbstractCollectionConverter { @SuppressWarnings("unchecked") protected Object doExecute(Object source) throws Exception { Collection sourceCollection = (Collection) source; - Class targetCollectionType = getTargetCollectionType(); - Class implClass = CollectionConversionUtils.getImpl(targetCollectionType); + Class implClass = CollectionConversionUtils.getImpl(getTargetCollectionType()); Collection targetCollection = (Collection) implClass.newInstance(); - ConversionExecutor elementConverter = getElementConverter(); - Class elementType; - if (elementConverter == null) { - elementType = getTargetElementType(); - } else { - elementType = null; - } + ConversionExecutor elementConverter = getElementConverter(sourceCollection); Iterator it = sourceCollection.iterator(); while (it.hasNext()) { - Object value = it.next(); - if (elementConverter == null && elementType != null) { - elementConverter = getConversionService().getConversionExecutor(value.getClass(), TypeDescriptor.valueOf(elementType)); - } - value = elementConverter.execute(value); - targetCollection.add(value); + targetCollection.add(elementConverter.execute(it.next())); } return targetCollection; } + private ConversionExecutor getElementConverter(Collection source) { + ConversionExecutor elementConverter = getElementConverter(); + if (elementConverter == NoOpConversionExecutor.INSTANCE && !source.isEmpty() && getTargetElementType() != null) { + Iterator it = source.iterator(); + while (it.hasNext()) { + Object value = it.next(); + if (value != null) { + elementConverter = getConversionService().getConversionExecutor(value.getClass(), TypeDescriptor.valueOf(getTargetElementType())); + break; + } + } + } + return elementConverter; + } + } \ No newline at end of file diff --git a/org.springframework.core/src/test/java/org/springframework/core/convert/service/CollectionToCollectionTests.java b/org.springframework.core/src/test/java/org/springframework/core/convert/service/CollectionToCollectionTests.java new file mode 100644 index 00000000000..3126e8b679e --- /dev/null +++ b/org.springframework.core/src/test/java/org/springframework/core/convert/service/CollectionToCollectionTests.java @@ -0,0 +1,79 @@ +package org.springframework.core.convert.service; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.junit.Test; +import org.springframework.core.convert.TypeDescriptor; + +public class CollectionToCollectionTests { + + @Test + public void testCollectionToCollectionConversion() throws Exception { + DefaultConversionService service = new DefaultConversionService(); + CollectionToCollection c = new CollectionToCollection(new TypeDescriptor(getClass().getField("bindTarget")), + new TypeDescriptor(getClass().getField("integerTarget")), service); + bindTarget.add("1"); + bindTarget.add("2"); + bindTarget.add("3"); + List result = (List) c.execute(bindTarget); + assertEquals(new Integer(1), result.get(0)); + assertEquals(new Integer(2), result.get(1)); + assertEquals(new Integer(3), result.get(2)); + } + + @Test + public void testCollectionToCollectionConversionNoGenericInfo() throws Exception { + DefaultConversionService service = new DefaultConversionService(); + CollectionToCollection c = new CollectionToCollection(TypeDescriptor.valueOf(Collection.class), + TypeDescriptor.valueOf(List.class), service); + bindTarget.add("1"); + bindTarget.add("2"); + bindTarget.add("3"); + List result = (List) c.execute(bindTarget); + assertEquals("1", result.get(0)); + assertEquals("2", result.get(1)); + assertEquals("3", result.get(2)); + } + + @Test + public void testCollectionToCollectionConversionNoGenericInfoSource() throws Exception { + DefaultConversionService service = new DefaultConversionService(); + CollectionToCollection c = new CollectionToCollection(TypeDescriptor.valueOf(Collection.class), + new TypeDescriptor(getClass().getField("integerTarget")), service); + bindTarget.add("1"); + bindTarget.add("2"); + bindTarget.add("3"); + List result = (List) c.execute(bindTarget); + assertEquals(new Integer(1), result.get(0)); + assertEquals(new Integer(2), result.get(1)); + assertEquals(new Integer(3), result.get(2)); + } + + @Test + public void testCollectionToCollectionConversionNoGenericInfoSourceNullValues() throws Exception { + DefaultConversionService service = new DefaultConversionService(); + CollectionToCollection c = new CollectionToCollection(TypeDescriptor.valueOf(Collection.class), + new TypeDescriptor(getClass().getField("integerTarget")), service); + bindTarget.add(null); + bindTarget.add("1"); + bindTarget.add("2"); + bindTarget.add(null); + bindTarget.add("3"); + List result = (List) c.execute(bindTarget); + assertEquals(null, result.get(0)); + assertEquals(new Integer(1), result.get(1)); + assertEquals(new Integer(2), result.get(2)); + assertEquals(null, result.get(3)); + assertEquals(new Integer(3), result.get(4)); + } + + + public Collection bindTarget = new ArrayList(); + public List integerTarget = new ArrayList(); + + +}