Details
-
Bug
-
Status: Closed
-
Minor
-
Resolution: Fixed
-
1.8, 1.9
-
None
Description
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.