You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Niall Pemberton (JIRA)" <ji...@apache.org> on 2009/10/05 19:00:31 UTC

[jira] Resolved: (BEANUTILS-359) Difference in setProperty() behavior when invoking setter with a String value that has ':'

     [ https://issues.apache.org/jira/browse/BEANUTILS-359?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Niall Pemberton resolved BEANUTILS-359.
---------------------------------------

    Resolution: Won't Fix

The problem in BeanUtils 1.7.0 was that in BeanUtils's setProperty() method if the destination type was a String array and the value was a String then a String array with length of 1 was created and the value set to the first instance of that String *before* convert utils had a chance to delegate to a converter:

{code}
} else if (value instanceof String) {
    String values[] = new String[1];
    values[0] = (String) value;
    newValue = getConvertUtils().convert((String[]) values, type);
} else if (....) {
{code}

...which is why you had to do hacks like you have in your SimplePojoData's setJcrMixinTypes() method to split the first occurrence of the String array being set:

{code}
public void setJcrMixinTypes(String[] mixinTypes) {
    if (null != mixinTypes && mixinTypes.length == 1) {
        jcrMixinTypes = mixinTypes[0].split(" *, *");
    }
}
{code}

In BeanUtils 1.8.0 we changed the behaviour so that the conversion of the String --> String[] is now handled by the converter registered for String arrays (see BEANUTILS-258).  So now you can either change how the ArrayConverter for String[] is configured (or register your own converter implementation for String arrays). In this case if you add colon to the *allowedCharacters* then you should see the behaviour you want:

{code}
ArrayConverter converter = new ArrayConverter(String[].class, new StringConverter());
converter.setAllowedChars(new char[] {'.', '-', ':'});
ConvertUtils.register(converter, String[].class);
{code}

Then you can remove the nasty hack from your SimplePojoData's setJcrMixinTypes() method:

{code}
public void setJcrMixinTypes(String[] mixinTypes) {
    this.jcrMixinTypes = mixinTypes;
}
{code}

Alternatively you could create a converter implementation that does what BeanUtils 1.7.0 did - create a String array with a length of 1 and set the String value to the first element - then you can leave your hack in SimplePojoData unchanged.

Closing this as WONTFIX since its working as intended.

> Difference in setProperty() behavior when invoking setter with a String value that has ':'
> ------------------------------------------------------------------------------------------
>
>                 Key: BEANUTILS-359
>                 URL: https://issues.apache.org/jira/browse/BEANUTILS-359
>             Project: Commons BeanUtils
>          Issue Type: Bug
>    Affects Versions: 1.8.0
>         Environment: JDK6
>            Reporter: Boni Gopalan
>             Fix For: 1.8.1
>
>         Attachments: beanutils-test.zip
>
>
> The behavior of BeanUtils.setProperty differes from 1.7.0 when invoking setter with a string value that has a : or any other common seperator.
> 1.8.0 --> BeanUtils.setProperty(simplePojo, "jcrMixinTypes", "mix:rereferencible");  Splits mix:referensible to new String[]{"mix","referencible"}
> 1.7.0 --> BeanUtils.setProperty(simplePojo, "jcrMixinTypes", "mix:rereferencible");  Splits mix:referensible to new String[]{"mix:referencible"}
> I have a failing testcase that I am atatching.  Please run with 
> mvn clean test -Dbeanutils.version=1.8.0   ==>  for using 1.8.0 version 
> mvn clean test -Dbeanutils.version=1.7.0  ==>  for using 1.7.0 version 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.