BeanUtilsBean.setProperty throws IllegalArgumentException if getter of nested
property returns null
---------------------------------------------------------------------------------------------------
Key: BEANUTILS-411
URL: https://issues.apache.org/jira/browse/BEANUTILS-411
Project: Commons BeanUtils
Issue Type: Bug
Components: Bean / Property Utils
Affects Versions: 1.8.3, 1.8.2, 1.8.1, 1.8.0
Environment: Apache Struts 1.3.10 (latest) uses commons-beanutils 1.8.0
Reporter: Marcus Zander
The issue is like #BEANUTILS-331, BEANUTILS-339 where BeanUtils.populate() ->
BeanUtilsBean.setProperty throws an IllegalArgumentException when it should not.
error situation (see attached JUnitTest):
BeanUtilsBean.setProperty(bean,"foo.bar", value) with a nested property
"foo.bar" where bean.getFoo() returns null.
Line 903 (in 1.8.0 -1.8.3) getPropertyUtils().getProperty(target,
resolver.next(name));
returns null (because bean.getFoo() returns null) which is not handled
correctly.
The Exception is thrown in line 963 because target == null.
expected:
SetProperty should silently return like in the case the property does not exist.
background:
BeanUtils.populate(), BeanUtilsBean.setProperty are used by Struts to populate
HTTP-Request-Parameters to form beans (form backing objects). The request sent
by a browser when clicking a <input type="image" name="imgLink"...> contains
parameters "imgLink.x" and "imgLink.y". These request parameters should not let
to an error when populating to a bean which has the property "imgLink".
The application should be able to process these parameters after bean
populating, which is not possible now because populate fails.
Test case to reproduce:
public class BeanUtilsBeanTest extends TestCase
{
public void testSetProperty()
throws Exception
{
DummyBean testBean = new DummyBean(); // nested==null
BeanUtilsBean instance = new BeanUtilsBean();
/* fails with java.lang.IllegalArgumentException: No bean specified
* Reason: getPropertyUtils().getProperty(target,
resolver.next(name)); returnes null
* because DummyBean.getImgLink() returns null
*/
instance.setProperty(testBean, "imgLink.x", "1");
}
public class DummyBean
{
private String imgLink = null; // stays null
public String getImgLink ()
{
return imgLink;
}
public void setImgLink(String imgLink)
{
this.imgLink = imgLink;
}
}
}
suggestion for a fix:
Return after line 903 if getProperty returns null and therefor target becomes
null.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira