[jira] [Created] (BEANUTILS-393) BeanUtilsBean sets a wrong type to value when mapped key is set

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[jira] [Created] (BEANUTILS-393) BeanUtilsBean sets a wrong type to value when mapped key is set

Gary D. Gregory (Jira)
BeanUtilsBean sets a wrong type to value when mapped key is set
---------------------------------------------------------------

                 Key: BEANUTILS-393
                 URL: https://issues.apache.org/jira/browse/BEANUTILS-393
             Project: Commons BeanUtils
          Issue Type: Bug
          Components: Bean / Property Utils
    Affects Versions: 1.8.3
         Environment: any
            Reporter: Krolikowski


In my opinion line no 968 in org.apache.commons.beanutils.BeanUtilsBean sets the wrong value to "type" variable.
Look:

{code:title=BeanUtilsBean.java}
            if (descriptor instanceof MappedPropertyDescriptor) {
                if (((MappedPropertyDescriptor) descriptor).getMappedWriteMethod() == null) {
                    if (log.isDebugEnabled()) {
                        log.debug("Skipping read-only property");
                    }
                    return; // Read-only, skip this property setter
                }
                type = ((MappedPropertyDescriptor) descriptor).
                    getMappedPropertyType();
            } else if (index >= 0 && descriptor instanceof IndexedPropertyDescriptor) {
                if (((IndexedPropertyDescriptor) descriptor).getIndexedWriteMethod() == null) {
                    if (log.isDebugEnabled()) {
                        log.debug("Skipping read-only property");
                    }
                    return; // Read-only, skip this property setter
                }
                type = ((IndexedPropertyDescriptor) descriptor).
                    getIndexedPropertyType();
            } else if (key != null) {
                if (descriptor.getReadMethod() == null) {
                    if (log.isDebugEnabled()) {
                        log.debug("Skipping read-only property");
                    }
                    return; // Read-only, skip this property setter
                }
                type = (value == null) ? Object.class : value.getClass();  // here is the bug, imho!!!
            } else {
                if (descriptor.getWriteMethod() == null) {
                    if (log.isDebugEnabled()) {
                        log.debug("Skipping read-only property");
                    }
                    return; // Read-only, skip this property setter
                }
                type = descriptor.getPropertyType();
            }
{code}

For example: Variable "value" can be an instance of String[]. It will have this value if there is a property "test" type of Hashmap<String,String> in bean and a property "test(123)" will come from the form. Variable "value" will have a value String[] {"123"}.
The variable "type" should get in this case a value of String.class, not String[].class (not an array), what happens in this line:
{code}
type = (value == null) ? Object.class : value.getClass();
{code}

This bug and the of populating data gives an exception: java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String,
when accessing test.get("123").



--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
Reply | Threaded
Open this post in threaded view
|

[jira] [Commented] (BEANUTILS-393) BeanUtilsBean sets a wrong type to value when mapped key is set

Gary D. Gregory (Jira)

    [ https://issues.apache.org/jira/browse/BEANUTILS-393?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13061209#comment-13061209 ]

Tiago commented on BEANUTILS-393:
---------------------------------

Hi Krolikowski !!

I got the same problem here. I think its a bug in the code.

Maybe the right way must be change the line 968 :

-=-=-=-=-=-= [ from :
type = (value == null) ? Object.class : value.getClass();

-=-=-=-=-=-= [ to  :
type = descriptor.getPropertyType();

To fix my problem i downgraded from 1.8.3 to 1.7.0  :(.. but i lost all new features and bug fixeds from the new version. Other think u could do, is create a new version of BeanUtilsBean and repack the code. :S

If u find the better solution, please let me know.

Thanks


> BeanUtilsBean sets a wrong type to value when mapped key is set
> ---------------------------------------------------------------
>
>                 Key: BEANUTILS-393
>                 URL: https://issues.apache.org/jira/browse/BEANUTILS-393
>             Project: Commons BeanUtils
>          Issue Type: Bug
>          Components: Bean / Property Utils
>    Affects Versions: 1.8.3
>         Environment: any
>            Reporter: Krolikowski
>
> In my opinion line no 968 in org.apache.commons.beanutils.BeanUtilsBean sets the wrong value to "type" variable.
> Look:
> {code:title=BeanUtilsBean.java}
>             if (descriptor instanceof MappedPropertyDescriptor) {
>                 if (((MappedPropertyDescriptor) descriptor).getMappedWriteMethod() == null) {
>                     if (log.isDebugEnabled()) {
>                         log.debug("Skipping read-only property");
>                     }
>                     return; // Read-only, skip this property setter
>                 }
>                 type = ((MappedPropertyDescriptor) descriptor).
>                     getMappedPropertyType();
>             } else if (index >= 0 && descriptor instanceof IndexedPropertyDescriptor) {
>                 if (((IndexedPropertyDescriptor) descriptor).getIndexedWriteMethod() == null) {
>                     if (log.isDebugEnabled()) {
>                         log.debug("Skipping read-only property");
>                     }
>                     return; // Read-only, skip this property setter
>                 }
>                 type = ((IndexedPropertyDescriptor) descriptor).
>                     getIndexedPropertyType();
>             } else if (key != null) {
>                 if (descriptor.getReadMethod() == null) {
>                     if (log.isDebugEnabled()) {
>                         log.debug("Skipping read-only property");
>                     }
>                     return; // Read-only, skip this property setter
>                 }
>                 type = (value == null) ? Object.class : value.getClass();  // here is the bug, imho!!!
>             } else {
>                 if (descriptor.getWriteMethod() == null) {
>                     if (log.isDebugEnabled()) {
>                         log.debug("Skipping read-only property");
>                     }
>                     return; // Read-only, skip this property setter
>                 }
>                 type = descriptor.getPropertyType();
>             }
> {code}
> For example: Variable "value" can be an instance of String[]. It will have this value if there is a property "test" type of Hashmap<String,String> in bean and a property "test(123)" will come from the form. Variable "value" will have a value String[] {"123"}.
> The variable "type" should get in this case a value of String.class, not String[].class (not an array), what happens in this line:
> {code}
> type = (value == null) ? Object.class : value.getClass();
> {code}
> This bug and the of populating data gives an exception: java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String,
> when accessing test.get("123").

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira