Dzmitry Kazimirchyk created CAY-2064:
----------------------------------------

             Summary: Issue with BeanAccessor for classes with complex 
inheritance
                 Key: CAY-2064
                 URL: https://issues.apache.org/jira/browse/CAY-2064
             Project: Cayenne
          Issue Type: Bug
    Affects Versions: 4.0.M3
            Reporter: Dzmitry Kazimirchyk


As reported on github per [https://github.com/apache/cayenne/pull/87]:

In certain cases, simply adding an interface to a class with no other changes 
can break PropertyUtils.setProperty.

For example, consider a HasName interface and a Person entity with a name 
attribute:

{code:java}
public interface HasName {
    CharSequence getName();
}
public class _Person extends CayenneDataObject {
    public void setName(String name) {
        writeProperty(NAME_KEY, name);
    }
    public String getName() {
        return (String) readProperty(NAME_KEY);
    }
}
public class Person extends _Person implements HasName {
}
{code}

My only change from the generated classes is to make Person implement HasName. 
Now, when I call PropertyUtils.setProperty(person, Person.NAME_KEY, newName), I 
get a PropertyException: Property "name" is not writable.

What's happening is that the compiler is generating a synthetic, no-arg method 
in Person.class named "getName" that returns a CharSequence. Since that's the 
only no-arg method named "getName" in the class, that's the method returned by 
Class.getMethod. (It finds a method in the class and so never checks the super 
class, per the documentation.) When BeanAccessor looks for the write method, it 
looks for setName(CharSequence) instead of setName(String) and comes up empty.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to