Type of overridden property is resolved incorrectly

XMLWordPrintable

    • b06
    • b117

        FULL PRODUCT VERSION :
        java version "1.7.0_45"
        Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
        Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)


        A DESCRIPTION OF THE PROBLEM :
        Introspector behavior has changed in 7u40 compared to 7u25 - if return type of getter method can be casted to the return type of getter with same name defined in super-class, then Introspector uses return type of getter in parent class to determine property type.
        As result, even if child bean class has a complete pair of getter and setter methods for property which type is descendant of another property defined in parent bean class, then such property is not recognized by Introspector - it uses type defined in super-class and doesn't link write method for property from child-class.

        REGRESSION. Last worked in version 7u25

        ADDITIONAL REGRESSION INFORMATION:
        java version "1.7.0_25"
        Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
        Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)


        STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
        1. Create two classes - A and B, where B extends A.
        2. Create a base bean class - BeanA, with getter and setter pair for property 'data' of type A:
        public void setData(A value)
        public A getData()
        3. Create a child bean class - BeanB (BeanB extends BeanA) with getter and setter pair for property 'data' of type B:
        public void setData(B value)
        public B getData()
        4. Run Introspector on BeanB and get type for property 'data' and its read and write methods.

        EXPECTED VERSUS ACTUAL BEHAVIOR :
        EXPECTED -
        Property type: B
        Read method: BeanB.getData()
        Write method: BeanB.setData()
        ACTUAL -
        Property type: A
        Read method: BeanB.getData()
        Write method: BeanA.setData()

        REPRODUCIBILITY :
        This bug can be reproduced always.

        ---------- BEGIN SOURCE ----------
        A.java:
        public class A {}

        B.java:
        public class B extends A {}

        BeanA.java:
        public class BeanA
        {
          public void setData(A value) {}
          public A getData() {return null;}
        }

        BeanB.java:
        public class BeanB extends BeanA
        {
          public void setData(B value) {}
          public B getData() {return null;}
        }

        Test.java:
        import java.beans.*;
        public class Test
        {
          public static void main(String[] args)
          {
            try
            {
              for(PropertyDescriptor pd : Introspector.getBeanInfo(BeanB.class).getPropertyDescriptors())
              {
                if ("data".equals(pd.getName()))
                {
                  System.out.println("Type: "+pd.getPropertyType().getName());
                  System.out.println("Read: "+pd.getReadMethod());
                  System.out.println("Write: "+pd.getWriteMethod());
                }
              }
            } catch (Throwable t)
            {
              t.printStackTrace();
            }
          }
        }
        ---------- END SOURCE ----------

        CUSTOMER SUBMITTED WORKAROUND :
        One can create custom BeanInfo class for BeanB to describe bean properties with correct type and links to correct getter and setter methods

              Assignee:
              Sergey Malenkov (Inactive)
              Reporter:
              Sergey Malenkov (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

                Created:
                Updated:
                Resolved: