diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java b/org.springframework.beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java index 85100b836c2..049a0694385 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java @@ -202,6 +202,13 @@ class TypeConverterDelegate { // Value not of required type? if (editor != null || (requiredType != null && !ClassUtils.isAssignableValue(requiredType, convertedValue))) { + if (requiredType != null && Collection.class.isAssignableFrom(requiredType) && + convertedValue instanceof String && typeDescriptor.getMethodParameter() != null) { + Class elementType = GenericCollectionTypeResolver.getCollectionParameterType(typeDescriptor.getMethodParameter()); + if (elementType != null && Enum.class.isAssignableFrom(elementType)) { + convertedValue = StringUtils.commaDelimitedListToStringArray((String) convertedValue); + } + } if (editor == null) { editor = findDefaultEditor(requiredType, typeDescriptor); } @@ -214,6 +221,9 @@ class TypeConverterDelegate { if (convertedValue != null) { if (requiredType.isArray()) { // Array required -> apply appropriate conversion of elements. + if (convertedValue instanceof String && Enum.class.isAssignableFrom(requiredType.getComponentType())) { + convertedValue = StringUtils.commaDelimitedListToStringArray((String) convertedValue); + } return (T) convertToTypedArray(convertedValue, propertyName, requiredType.getComponentType()); } else if (convertedValue instanceof Collection) { diff --git a/org.springframework.beans/src/test/java/org/springframework/beans/BeanWrapperEnumTests.java b/org.springframework.beans/src/test/java/org/springframework/beans/BeanWrapperEnumTests.java index 43182fe69ac..d41aa7a215e 100644 --- a/org.springframework.beans/src/test/java/org/springframework/beans/BeanWrapperEnumTests.java +++ b/org.springframework.beans/src/test/java/org/springframework/beans/BeanWrapperEnumTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 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. @@ -17,9 +17,7 @@ package org.springframework.beans; import static org.junit.Assert.*; - import org.junit.Test; - import test.beans.CustomEnum; import test.beans.GenericBean; @@ -53,4 +51,62 @@ public final class BeanWrapperEnumTests { assertEquals(null, gb.getCustomEnum()); } + @Test + public void testCustomEnumArrayWithSingleValue() { + GenericBean gb = new GenericBean(); + BeanWrapper bw = new BeanWrapperImpl(gb); + bw.setPropertyValue("customEnumArray", "VALUE_1"); + assertEquals(1, gb.getCustomEnumArray().length); + assertEquals(CustomEnum.VALUE_1, gb.getCustomEnumArray()[0]); + } + + @Test + public void testCustomEnumArrayWithMultipleValues() { + GenericBean gb = new GenericBean(); + BeanWrapper bw = new BeanWrapperImpl(gb); + bw.setPropertyValue("customEnumArray", new String[] {"VALUE_1", "VALUE_2"}); + assertEquals(2, gb.getCustomEnumArray().length); + assertEquals(CustomEnum.VALUE_1, gb.getCustomEnumArray()[0]); + assertEquals(CustomEnum.VALUE_2, gb.getCustomEnumArray()[1]); + } + + @Test + public void testCustomEnumArrayWithMultipleValuesAsCsv() { + GenericBean gb = new GenericBean(); + BeanWrapper bw = new BeanWrapperImpl(gb); + bw.setPropertyValue("customEnumArray", "VALUE_1,VALUE_2"); + assertEquals(2, gb.getCustomEnumArray().length); + assertEquals(CustomEnum.VALUE_1, gb.getCustomEnumArray()[0]); + assertEquals(CustomEnum.VALUE_2, gb.getCustomEnumArray()[1]); + } + + @Test + public void testCustomEnumSetWithSingleValue() { + GenericBean gb = new GenericBean(); + BeanWrapper bw = new BeanWrapperImpl(gb); + bw.setPropertyValue("customEnumSet", "VALUE_1"); + assertEquals(1, gb.getCustomEnumSet().size()); + assertTrue(gb.getCustomEnumSet().contains(CustomEnum.VALUE_1)); + } + + @Test + public void testCustomEnumSetWithMultipleValues() { + GenericBean gb = new GenericBean(); + BeanWrapper bw = new BeanWrapperImpl(gb); + bw.setPropertyValue("customEnumSet", new String[] {"VALUE_1", "VALUE_2"}); + assertEquals(2, gb.getCustomEnumSet().size()); + assertTrue(gb.getCustomEnumSet().contains(CustomEnum.VALUE_1)); + assertTrue(gb.getCustomEnumSet().contains(CustomEnum.VALUE_2)); + } + + @Test + public void testCustomEnumSetWithMultipleValuesAsCsv() { + GenericBean gb = new GenericBean(); + BeanWrapper bw = new BeanWrapperImpl(gb); + bw.setPropertyValue("customEnumSet", "VALUE_1,VALUE_2"); + assertEquals(2, gb.getCustomEnumSet().size()); + assertTrue(gb.getCustomEnumSet().contains(CustomEnum.VALUE_1)); + assertTrue(gb.getCustomEnumSet().contains(CustomEnum.VALUE_2)); + } + } diff --git a/org.springframework.beans/src/test/java/test/beans/GenericBean.java b/org.springframework.beans/src/test/java/test/beans/GenericBean.java index 25f61c4aa75..acb9bdb76e5 100644 --- a/org.springframework.beans/src/test/java/test/beans/GenericBean.java +++ b/org.springframework.beans/src/test/java/test/beans/GenericBean.java @@ -60,11 +60,14 @@ public class GenericBean { private CustomEnum customEnum; + private CustomEnum[] customEnumArray; + + private Set customEnumSet; + private T genericProperty; private List genericListProperty; - public GenericBean() { } @@ -225,6 +228,22 @@ public class GenericBean { this.customEnum = customEnum; } + public CustomEnum[] getCustomEnumArray() { + return customEnumArray; + } + + public void setCustomEnumArray(CustomEnum[] customEnum) { + this.customEnumArray = customEnum; + } + + public Set getCustomEnumSet() { + return customEnumSet; + } + + public void setCustomEnumSet(Set customEnumSet) { + this.customEnumSet = customEnumSet; + } + public static GenericBean createInstance(Set integerSet) { return new GenericBean(integerSet); }