You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Marco Janc (Jira)" <ji...@apache.org> on 2019/10/07 11:49:00 UTC

[jira] [Updated] (BEANUTILS-526) copyProperty should instantiate nested properties

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

Marco Janc updated BEANUTILS-526:
---------------------------------
    Description: 
The function _BeanUtils.copyProperty(bean, name, value)_ shall instantiate nested properties before copying them.

 

*Example:*

 
{code:java}
class Foo
{
 Bar bar;
}

class Bar
{
 int id;
}
{code}
 

 

We now have an instance of _Foo_ where _bar_ property is null and call:

 
{code:java}
Foo foo = new Foo();
BeanUtils.copyProperty(foo, "bar.id", 3);
{code}
This will throw an exception currently.

 

*Workaround*

In my generic copy method, i instantiate all required nested properties before. Here my implementation. In BeanUtils this could be done more lazy when the target is null.

 
{code:java}
	/**
	 * Instantiates the nested properties of the given Object with proxy Objects
	 * with the given property fieldname.
	 *
	 * @param obj
	 * @param fieldName
	 *
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	public static void instantiateNestedProperties(final Object obj, final String fieldName)
		throws IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException
	{
		final String[] fieldNames = fieldName.split("\\.");
		if (fieldNames.length == 1)
			return;		final StringBuffer nestedProperty = new StringBuffer();		// outsource temporary variables to optimize performance
		String fn = null;
		Object value = null;
		PropertyDescriptor propertyDescriptor = null;
		Class<?> propertyType = null;
		Object newInstance = null;		for (int i = 0; i < fieldNames.length - 1; i++)
		{
			fn = fieldNames[i];
			if (i != 0)
				nestedProperty.append(".");
			nestedProperty.append(fn);			value = PropertyUtils.getProperty(obj, nestedProperty.toString());			if (value == null)
			{
				propertyDescriptor = PropertyUtils.getPropertyDescriptor(obj, nestedProperty.toString());
				propertyType = propertyDescriptor.getPropertyType();
				newInstance = propertyType.newInstance();
				PropertyUtils.setProperty(obj, nestedProperty.toString(), newInstance);
			}
		}
	}
{code}
 

 

 

 

  was:
The function _BeanUtils.copyProperty(bean, name, value)_ shall instantiate nested properties before copying them.

 

*Example:*

 

 
{code:java}

{code}
*class Foo*
*{*
    *Bar bar;*
*}*

*class Bar*
*{*
    *int id;*
*}*

 

We now have an instance of _Foo_ where _bar_ property is null and call:

 
{code:java}
Foo foo = new Foo();
BeanUtils.copyProperty(foo, "bar.id", 3);
{code}
This will throw an exception currently.

 

*Workaround*

In my generic copy method, i instantiate all required nested properties before.

 

 


> copyProperty should instantiate nested properties
> -------------------------------------------------
>
>                 Key: BEANUTILS-526
>                 URL: https://issues.apache.org/jira/browse/BEANUTILS-526
>             Project: Commons BeanUtils
>          Issue Type: Bug
>          Components: Bean / Property Utils
>    Affects Versions: 1.9.4
>            Reporter: Marco Janc
>            Priority: Major
>
> The function _BeanUtils.copyProperty(bean, name, value)_ shall instantiate nested properties before copying them.
>  
> *Example:*
>  
> {code:java}
> class Foo
> {
>  Bar bar;
> }
> class Bar
> {
>  int id;
> }
> {code}
>  
>  
> We now have an instance of _Foo_ where _bar_ property is null and call:
>  
> {code:java}
> Foo foo = new Foo();
> BeanUtils.copyProperty(foo, "bar.id", 3);
> {code}
> This will throw an exception currently.
>  
> *Workaround*
> In my generic copy method, i instantiate all required nested properties before. Here my implementation. In BeanUtils this could be done more lazy when the target is null.
>  
> {code:java}
> 	/**
> 	 * Instantiates the nested properties of the given Object with proxy Objects
> 	 * with the given property fieldname.
> 	 *
> 	 * @param obj
> 	 * @param fieldName
> 	 *
> 	 * @throws NoSuchMethodException
> 	 * @throws InvocationTargetException
> 	 * @throws IllegalAccessException
> 	 * @throws InstantiationException
> 	 */
> 	public static void instantiateNestedProperties(final Object obj, final String fieldName)
> 		throws IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException
> 	{
> 		final String[] fieldNames = fieldName.split("\\.");
> 		if (fieldNames.length == 1)
> 			return;		final StringBuffer nestedProperty = new StringBuffer();		// outsource temporary variables to optimize performance
> 		String fn = null;
> 		Object value = null;
> 		PropertyDescriptor propertyDescriptor = null;
> 		Class<?> propertyType = null;
> 		Object newInstance = null;		for (int i = 0; i < fieldNames.length - 1; i++)
> 		{
> 			fn = fieldNames[i];
> 			if (i != 0)
> 				nestedProperty.append(".");
> 			nestedProperty.append(fn);			value = PropertyUtils.getProperty(obj, nestedProperty.toString());			if (value == null)
> 			{
> 				propertyDescriptor = PropertyUtils.getPropertyDescriptor(obj, nestedProperty.toString());
> 				propertyType = propertyDescriptor.getPropertyType();
> 				newInstance = propertyType.newInstance();
> 				PropertyUtils.setProperty(obj, nestedProperty.toString(), newInstance);
> 			}
> 		}
> 	}
> {code}
>  
>  
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)