[
https://issues.apache.org/jira/browse/CONFIGURATION-546?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13680626#comment-13680626
]
Oliver Heger commented on CONFIGURATION-546:
--------------------------------------------
I had a look at your patch, and it is really good.
There is one thing I do not understand: How is the BeanDeclaration created in a
way that it contains a collection of other BeanDeclarations as a property
value? Do you create such declarations manually for your use case?
I mean, typically a concrete implementation class like {{XMLBeanDeclaration}}
is used and initialized from a configuration. (This was the original intension
of this whole subcomponent: to define service beans in configuration files.)
The class extracts the information about the bean to be created and its
properties from the passed in configuration object. But there is so far no
support for list properties. So in order to make this new feature really
usable, we would probably also have to extend {{XMLBeanDeclaration}} to process
declarations of list properties.
WDYT?
> 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
> 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