commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Oliver Heger (JIRA)" <>
Subject [jira] [Commented] (CONFIGURATION-546) ClassCastException in BeanHelper constructing beans with a list of child beans
Date Tue, 11 Jun 2013 20:23:20 GMT


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

> ClassCastException in BeanHelper constructing beans with a list of child beans
> ------------------------------------------------------------------------------
>                 Key: CONFIGURATION-546
>                 URL:
>             Project: Commons Configuration
>          Issue Type: Bug
>          Components: Type conversion
>    Affects Versions: 1.8, 1.9
>            Reporter: Justin Couch
>            Priority: Minor
>         Attachments: BeanCreateTestBeanWithListChild-BUG564.patch,,, BeanHelper-BUG564.patch,, TestBeanHelper-BUG564.patch,,
> 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(
> 	at org.apache.commons.configuration.beanutils.TestBeanHelper$TestBeanFactory.createBean(
> 	at org.apache.commons.configuration.beanutils.BeanHelper.createBean(
> 	... 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:

View raw message