Browse Source

Convert comma-separated string into list of classes analogous to existing support for class array

Issue: SPR-14415
pull/1095/head
Juergen Hoeller 10 years ago
parent
commit
c4c941c43f
  1. 14
      spring-beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java
  2. 32
      spring-beans/src/test/java/org/springframework/beans/factory/xml/XmlBeanCollectionTests.java
  3. 23
      spring-beans/src/test/java/org/springframework/tests/sample/beans/HasMap.java
  4. 17
      spring-beans/src/test/resources/org/springframework/beans/factory/xml/collections.xml
  5. 9
      spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java

14
spring-beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2015 the original author or authors.
* Copyright 2002-2016 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.
@ -183,10 +183,14 @@ class TypeConverterDelegate { @@ -183,10 +183,14 @@ 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 elementType = typeDescriptor.getElementTypeDescriptor();
if (elementType != null && Enum.class.isAssignableFrom(elementType.getType())) {
convertedValue = StringUtils.commaDelimitedListToStringArray((String) convertedValue);
if (typeDescriptor != null && requiredType != null && Collection.class.isAssignableFrom(requiredType) &&
convertedValue instanceof String) {
TypeDescriptor elementTypeDesc = typeDescriptor.getElementTypeDescriptor();
if (elementTypeDesc != null) {
Class<?> elementType = elementTypeDesc.getType();
if (Class.class == elementType || Enum.class.isAssignableFrom(elementType)) {
convertedValue = StringUtils.commaDelimitedListToStringArray((String) convertedValue);
}
}
}
if (editor == null) {

32
spring-beans/src/test/java/org/springframework/beans/factory/xml/XmlBeanCollectionTests.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2013 the original author or authors.
* Copyright 2002-2016 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.
@ -29,6 +29,7 @@ import java.util.Set; @@ -29,6 +29,7 @@ import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.BeanCreationException;
@ -52,14 +53,16 @@ import static org.junit.Assert.*; @@ -52,14 +53,16 @@ import static org.junit.Assert.*;
*/
public class XmlBeanCollectionTests {
private final DefaultListableBeanFactory beanFactory;
private final DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
public XmlBeanCollectionTests() {
this.beanFactory = new DefaultListableBeanFactory();
@Before
public void loadBeans() {
new XmlBeanDefinitionReader(this.beanFactory).loadBeanDefinitions(
new ClassPathResource("collections.xml", getClass()));
}
@Test
public void testCollectionFactoryDefaults() throws Exception {
ListFactoryBean listFactory = new ListFactoryBean();
@ -327,6 +330,15 @@ public class XmlBeanCollectionTests { @@ -327,6 +330,15 @@ public class XmlBeanCollectionTests {
assertTrue(hasMap.getObjectArray()[1].equals(this.beanFactory.getBean("jenny")));
}
@Test
public void testIntegerArray() throws Exception {
HasMap hasMap = (HasMap) this.beanFactory.getBean("integerArray");
assertTrue(hasMap.getIntegerArray().length == 3);
assertTrue(hasMap.getIntegerArray()[0].intValue() == 0);
assertTrue(hasMap.getIntegerArray()[1].intValue() == 1);
assertTrue(hasMap.getIntegerArray()[2].intValue() == 2);
}
@Test
public void testClassArray() throws Exception {
HasMap hasMap = (HasMap) this.beanFactory.getBean("classArray");
@ -336,12 +348,11 @@ public class XmlBeanCollectionTests { @@ -336,12 +348,11 @@ public class XmlBeanCollectionTests {
}
@Test
public void testIntegerArray() throws Exception {
HasMap hasMap = (HasMap) this.beanFactory.getBean("integerArray");
assertTrue(hasMap.getIntegerArray().length == 3);
assertTrue(hasMap.getIntegerArray()[0].intValue() == 0);
assertTrue(hasMap.getIntegerArray()[1].intValue() == 1);
assertTrue(hasMap.getIntegerArray()[2].intValue() == 2);
public void testClassList() throws Exception {
HasMap hasMap = (HasMap) this.beanFactory.getBean("classList");
assertTrue(hasMap.getClassList().size()== 2);
assertTrue(hasMap.getClassList().get(0).equals(String.class));
assertTrue(hasMap.getClassList().get(1).equals(Exception.class));
}
@Test
@ -447,4 +458,5 @@ public class XmlBeanCollectionTests { @@ -447,4 +458,5 @@ public class XmlBeanCollectionTests {
return obj;
}
}
}

23
spring-beans/src/test/java/org/springframework/tests/sample/beans/HasMap.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2012 the original author or authors.
* Copyright 2002-2016 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,6 +17,7 @@ @@ -17,6 +17,7 @@
package org.springframework.tests.sample.beans;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@ -38,9 +39,11 @@ public class HasMap { @@ -38,9 +39,11 @@ public class HasMap {
private Object[] objectArray;
private Integer[] intArray;
private Class<?>[] classArray;
private Integer[] intArray;
private List<Class<?>> classList;
private IdentityHashMap identityMap;
@ -81,6 +84,14 @@ public class HasMap { @@ -81,6 +84,14 @@ public class HasMap {
this.objectArray = objectArray;
}
public Integer[] getIntegerArray() {
return intArray;
}
public void setIntegerArray(Integer[] is) {
intArray = is;
}
public Class<?>[] getClassArray() {
return classArray;
}
@ -89,12 +100,12 @@ public class HasMap { @@ -89,12 +100,12 @@ public class HasMap {
this.classArray = classArray;
}
public Integer[] getIntegerArray() {
return intArray;
public List<Class<?>> getClassList() {
return classList;
}
public void setIntegerArray(Integer[] is) {
intArray = is;
public void setClassList(List<Class<?>> classList) {
this.classList = classList;
}
public IdentityHashMap getIdentityMap() {

17
spring-beans/src/test/resources/org/springframework/beans/factory/xml/collections.xml

@ -288,15 +288,6 @@ @@ -288,15 +288,6 @@
</property>
</bean>
<bean id="classArray" class="org.springframework.tests.sample.beans.HasMap">
<property name="classArray">
<list>
<value>java.lang.String</value>
<value>java.lang.Exception</value>
</list>
</property>
</bean>
<bean id="integerArray" class="org.springframework.tests.sample.beans.HasMap">
<property name="integerArray">
<list>
@ -307,6 +298,14 @@ @@ -307,6 +298,14 @@
</property>
</bean>
<bean id="classArray" class="org.springframework.tests.sample.beans.HasMap">
<property name="classArray" value="java.lang.String,java.lang.Exception"/>
</bean>
<bean id="classList" class="org.springframework.tests.sample.beans.HasMap">
<property name="classList" value="java.lang.String,java.lang.Exception"/>
</bean>
<bean id="listFactory" class="org.springframework.beans.factory.config.ListFactoryBean">
<property name="sourceList">
<list>

9
spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2015 the original author or authors.
* Copyright 2002-2016 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.
@ -145,10 +145,9 @@ public class TypeDescriptor implements Serializable { @@ -145,10 +145,9 @@ public class TypeDescriptor implements Serializable {
/**
* The type of the backing class, method parameter, field, or property
* described by this TypeDescriptor.
* <p>Returns primitive types as-is.
* <p>See {@link #getObjectType()} for a variation of this operation that
* resolves primitive types to their corresponding Object types if necessary.
* @return the type, or {@code null} if it cannot be determined
* <p>Returns primitive types as-is. See {@link #getObjectType()} for a
* variation of this operation that resolves primitive types to their
* corresponding Object types if necessary.
* @see #getObjectType()
*/
public Class<?> getType() {

Loading…
Cancel
Save