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

Henri Yandell commented on BEANUTILS-281:
-----------------------------------------

Just to follow up more on this issue, the type of which I've seen crop up in 
Spring and Hibernate too:

http://opensource.atlassian.com/projects/spring/browse/SPR-2727
http://opensource.atlassian.com/projects/hibernate/browse/HHH-442
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2268
http://opensource.atlassian.com/projects/spring/browse/SPR-2968

The real bug is down in PropertyUtils.getPropertyDescriptors(Class). If you 
evoke that on Car.class, it considers that the 
AbstractVehicle.getField();Serializable class it the read method [wrong], and 
that there is no write method [wrong]. Basically it gives the result you would 
expect from evoking it on AbtractVehicle.class.

This is due to errors in the data returned from 
Introspector.getBeanInfo(Car.class).getPropertyDescriptors().

The solution is most likely to write our own version of the Introspector's 
getBeanInfo method:

http://java.sun.com/j2se/1.5.0/docs/api/java/beans/Introspector.html#getBeanInfo(java.lang.Class)

> BeanUtils.cloneBean and Covariant (Overriding) return types
> -----------------------------------------------------------
>
>                 Key: BEANUTILS-281
>                 URL: https://issues.apache.org/jira/browse/BEANUTILS-281
>             Project: Commons BeanUtils
>          Issue Type: Bug
>          Components: Bean / Property Utils
>         Environment: JDK1.5
>            Reporter: Onur Kutlu GAGO
>             Fix For: LATER THAN 1.8.0
>
>
> BeanUtils.cloneBean(Object) method does not copy the fields that are 
> overriden by the subclasses. For example, consider an abstract 
> class(AbstractVehicle) where you define an abstract getter for a field. 
> **************************
> public abstract class AbstractVehicle {
>       public abstract Serializable getField();
> }
> ***************************
> In a class (Car) that extends this abstract class (AbstractVehicle) you 
> define the field itself and override the return type of the getter method 
> (from Serializable to Integer):
> ***************************
> public class Car extends AbstractVehicle {
>       private Integer field = null;
>       @Override
>       public Integer getField() {
>               return field;
>       }
>       public void setField(Integer field) {
>               this.field = field;
>       }
> }
> ***************************
> When you clone such objects (Car) this field is not copied! The following 
> code prints 'null' instead of 5!
> ***************************
> public class CopyTestMain {
>       public static void main(String[] args) throws IllegalAccessException, 
> InstantiationException, InvocationTargetException, NoSuchMethodException {
>               final Car aCar = new Car();
>               aCar.setField(5);
>               final Car copyCar = (Car) BeanUtils.cloneBean(aCar);
>               System.out.println("Field = " + copyCar.getField());
>       }
> }
> ***************************

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


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to