Justin Couch created CONFIGURATION-546:
------------------------------------------
Summary: ClassCastException in BeanHelper constructing beans with
a list of child beans
Key: CONFIGURATION-546
URL: https://issues.apache.org/jira/browse/CONFIGURATION-546
Project: Commons Configuration
Issue Type: Bug
Components: Type conversion
Affects Versions: 1.9, 1.8
Reporter: Justin Couch
Priority: Minor
If you wish to create a bean that has a collection as a property where that
collection contains multiple beans, the code crashes as it assumes that you can
only ever have single bean declarations as children.
For example the following brief construct is not possible to build
class A {
String name;
}
class B {
List<A> children;
}
The result is the following stack trace
Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to
org.apache.commons.configuration.beanutils.BeanDeclaration
at
org.apache.commons.configuration.beanutils.BeanHelper.initBean(BeanHelper.java:212)
at
org.apache.commons.configuration.beanutils.TestBeanHelper$TestBeanFactory.createBean(TestBeanHelper.java:579)
at
org.apache.commons.configuration.beanutils.BeanHelper.createBean(BeanHelper.java:342)
... 33 more
It's pretty easy to see why when you look at the code beginning line 208:
for (Map.Entry<String, Object> e : nestedBeans.entrySet())
{
String propName = e.getKey();
Class<?> defaultClass = getDefaultClass(bean, propName);
initProperty(bean, propName, createBean(
(BeanDeclaration) e.getValue(), defaultClass));
}
Note the silly assumption that e.getValue() only ever has BeanDeclaration
instances, where it could be BeanDeclaration[], or Collection<BeanDeclaration>
as other possible options - which is what the above example show.
Extended version of the existing unit test to follow that illustrates the
problem.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira