commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gareth Andrew <gareth.and...@ntlworld.com>
Subject Re: Problems with an inherited getter in a derived bean
Date Thu, 19 Jun 2003 15:25:51 GMT
Hi,

Just for fun  I set up a little test app.  It demonstrates that the bug 
is definitely in Common Beanutils.  Normal Java relfection can call a 
method derived from a protected nested class without problems.  The 
problem seems to be in o/a/c/b/MethodUtils.java :  line 442ish where 
Beanutils checks the declaring class to see if its public - it should 
probably check the derived class instead ie clazz = method.getClass()

-----MethodUtils.java - getAccessibleMethod(Method method) ---------

    // If the requested method is not public we cannot call it
        if (!Modifier.isPublic(method.getModifiers())) {
            return (null);
        }

        // If the declaring class is public, we are done
        Class clazz = method.getDeclaringClass();
        if (Modifier.isPublic(clazz.getModifiers())) {
            return (method);
        }

----End------------------------------------------------------------------


As far as your problem goes the simplest fix seems to be write a public 
getName() method in Area and in its implementation call super.getName().
The alternative is to fix Beanutils (I haven't checked bugzilla so this 
might even be a recently fixed bug).  I'm cross-posting this to 
commons-dev to confirm that it is a bug since I may look at it a bit 
furthere and write a patch next week if I have the time.

Paul- Hope this helps
Alan - Hope this is of interest

Gareth.


PS.  I've also appended a quick test app I wrote

------scratchpad.java ------------------------------

public class scratchpad {

    public static void main(String[] args) throws Exception{
        publicNestedClass test = new publicNestedClass();
       
        //Works - nested inheritance works ok
        //System.out.println(test.getMessage());
       
       
        //Doesn't work PropertyUtils bug
        //System.out.println((String)PropertyUtils.getProperty(test, 
"message"));
       
        Class c = publicNestedClass.class;
        Method m = c.getMethod("getMessage", null);
        if(m!=null){
            System.out.println("Method " + m.getName() + " of " + 
m.getDeclaringClass() + " found.");
            System.out.println("Method " + 
(Modifier.isPublic(m.getModifiers()) ? "is" : "isn't") + " public");
            System.out.println("Class " + 
(Modifier.isPublic(m.getClass().getModifiers()) ? "is" : "isn't") + " 
public");
            System.out.println("Declaring Class " + 
(Modifier.isPublic(m.getDeclaringClass().getModifiers()) ? "is" : 
"isn't") + " public");
        }
   
        System.out.println((String)m.invoke(test, null));
    }
   
    protected static class protectedNestedClass {
        public String getMessage(){
            return "Hello from a protected nested class";
        }
    }
       
    public static class publicNestedClass extends protectedNestedClass{
       
    }
}
-------------------------------------------------------------------------------------------



Paul Harrison wrote:

> thanks for confirming that this should work - one fact that I omitted 
> in my original mailing was that the classes were inner classes
>
> i.e. it  was the PostCode.Area class that is in the collection
>
> public class PostCode
> {
>     protected static class Pbase
>    {
>        protected String name;
>
>        public String getName()
>        {
>            return name;
>        }
>
>    }
>    public static class Area extends Pbase
>    {
>    }        }
>
> I works it I change the access on the Pbase class to public, but do I 
> have to ? I thought that it was legal to have derived classes increase 
> the accessibility - I do not want to expose the Pbase class.... - 
> however this is pushing the limits of my knowledge about what should 
> be happening.....
>
>
> Alen Ribic wrote:
>
>> I'm doing the same thing in my current project successfully.
>> No problems in my specializes class.
>>
>> e.g.
>>
>> public abstract class BaseBusinessBean
>>    implements java.io.Serializable {
>>    protected int id;
>>    protected String description;
>>
>>    // getters/setters here
>> }
>>
>> e.g.
>>
>> public class Category
>>    extends BaseBusinessBean {
>>    // Category specific getters/setters
>> }
>>
>>
>> Now  I use Category class with no problem in my options for select box.
>>
>> You have code <snippet>?
>>
>> --Alen
>>
>>
>>
>> ----- Original Message -----
>> From: "Paul Harrison" <paul-harrison@ntlworld.com>
>> To: "Struts Users Mailing List" <struts-user@jakarta.apache.org>
>> Sent: Wednesday, June 18, 2003 4:55 PM
>> Subject: Problems with an inherited getter in a derived bean
>>
>>
>>  
>>
>>> In my struts application, I have a base bean with a set of basic
>>> properties (e.g. name) and then I create various derived beans with
>>> their own extra properties. I have a problem with the <html:options> 
>>> tag
>>> in that if I try to read a property  that is inherited from the base
>>> bean  from a collection of the derived beans
>>>
>>> i.e. I have a tag like this
>>>
>>> <html:options collection="CountyList" property="name" />
>>>
>>> - I get an error saying
>>>
>>> No getter method available for property name for bean under name
>>>   
>>
>> CountyList
>>  
>>
>>> and if I implement the getter in the derived bean the  error goes away.
>>> Is this known behaviour in struts - is seems like a bug to me (or
>>> perhaps a bug in commons-beanutils?) Can anyone comment....
>>>
>>> -- 
>>> Paul Harrison
>>>
>>> paul-harrison@ntlworld.com
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
>>> For additional commands, e-mail: struts-user-help@jakarta.apache.org
>>>
>>>   
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
>> For additional commands, e-mail: struts-user-help@jakarta.apache.org
>>
>>
>>  
>>
>



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message