Details
Description
Try this: given any pojo class MyBean.java,
MyBean orig = new MyBean();
MyBean dest = new MyBean();
DynaBean db = new WrapDynaBean(dest);
PropertyUtils.copyProperties(db, orig);
You'll see an exception like:
java.lang.IllegalArgumentException: Property 'class' has no write method
at org.apache.commons.beanutils.WrapDynaBean.set(WrapDynaBean.java:266)
This surprised me because 'copyProperties()' does an 'isWritable()' check before
it sets properties. However, what PropertyUtilsBean.isWritable actually does is
this:
if (bean instanceof DynaBean) {
// All DynaBean properties are writeable
return (((DynaBean) bean).getDynaClass().getDynaProperty(name) != null);
} ...
That's plainly wrong for a WrapDynaBean, since pretty much every wrapped object
has a non-writable 'class' property.
A workaround for the immediate problem:
if (db instanceof WrapDynaBean) {
PropertyUtils.copyProperties(((WrapDynaBean) db).getInstance(), src);
} else {
PropertyUtils.copyProperties(dest, src);
}
... the problem affects isReadable and isWritable, and hence copyProperties; to
fix it for all cases would (I think) require unwrapping any WrapDynaBeans passed
into those calls.
I guess having a situation where you'd use PropertyUtils /and/ WrapDynaBeans is
fairly unusual so this is just a minor bug.