You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Oliver Heger (JIRA)" <ji...@apache.org> on 2013/06/12 22:14:20 UTC
[jira] [Resolved] (CONFIGURATION-546) ClassCastException in
BeanHelper constructing beans with a list of child beans
[ https://issues.apache.org/jira/browse/CONFIGURATION-546?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Oliver Heger resolved CONFIGURATION-546.
----------------------------------------
Resolution: Fixed
Fix Version/s: 2.0
The patch was committed with minor changes in revision 1492404.
It would be great if you can work on additional list property support for XML-based bean declarations. This would enable the new feature for the typical Configuration user.
I am marking this ticket as resolved. Further work in this area can be assigned to a new one. Thanks again.
> 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.8, 1.9
> Reporter: Justin Couch
> Priority: Minor
> Fix For: 2.0
>
> Attachments: BeanCreateTestBeanWithListChild-BUG564.patch, BeanCreationTestBeanWithListChild.java, BeanCreationTestBeanWithListChild.java, BeanHelper-BUG564.patch, BeanHelper.java, TestBeanHelper-BUG564.patch, TestBeanHelper.java, TestBeanHelper.java
>
>
> 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