You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by Davide Cavallari <d....@ilte.com> on 2005/05/13 09:50:08 UTC
"No getter method error for property" caused by java.beans.Introspector
feature/bug
I recently had a problem with a bean which causes the "No getter method
for property..." error when used with the <bean:write> tag.
Surfing the web, I found a message posted October 27, 2004 09:41 AM in
the JavaRanch Struts forum by Erick Reid. The topic was "No getter
method for property... (but not the usual suspects)".
(http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=58&t=004112)
Interestingly, Erick suggested using a bean dump util
(http://wiki.apache.org/struts/ExposedBeanProperties) to get insight
about a bean's exposed properties.
Using it I discovered that the problem wasn't Struts Tag's
responsability, but Introspector's. Basically, it's due to the the
Introspector's default way of finding the BeanInfo.
I've found the following post by Dawid Weiss in
comp.lang.java.programmer. He reports the very same problem and clearly
explains what's going on.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Newsgroup: comp.lang.java.programmer
From: dawid.we...@cs.put.poznan.pl (Dawid Weiss)
Date: 20 Feb 2003.02.20 03:41:41 -0800
Subject: JDK 'feature' in java.beans.Introspector prevents accessing
properties of classes named Component
I've just spent 3 hours trying to find a bug in my STRUTS application.
As it turned out, it was neither my fault, nor STRUTS. It's just
undocumented (or maybe documented, but I'm not aware of it) 'feature' of
java.beans.Introspector class, used by STRUTS to access properties of
java beans.
The bug (?) only shows up when your class is named "Component", no
matter what package it is in and does not have any associated beaninfo
class. Then the 'discovered' set of properties will NOT be that of your
class, but java.awt.Component...
Is this a bug? A feature? This should at least have a mention in the
docs, right?
Dawid
--
Try this: create a java bean in you own package and name it "Component",
for example:
com.bubu.dede.Component
Create several setters and getters, as you wish. Now, try to use it
with STRUTS and use automatic introspection (JSP tags). It won't work
and you'll get a message saying "no property xxx in bean yyy". So you
dig in STRUTS code and see that it's using standard Java Introspection
class. Amazed, you type the following code:
BeanInfo beanInfo = Introspector.getBeanInfo(myBean.getClass());
PropertyDescriptor [] descriptors = beanInfo.getPropertyDescriptors();
for (int i=0;i<descriptors.length;i++)
System.out.println("property: " + descriptors[i].getName());
And the properties you see discovered are not at all those, which you
declared.
Why is that? Because Introspector's getBeanInfo uses the default:
USE_ALL_BEANINFO, which should check also BeanInfo classes from up the
hierarchy of your bean's classes. Unfortunately, which is mentioned in
the documentation, but quite vague, Introspector also uses "search path"
to look for BeanInfos:
"We first look for the BeanInfo class by taking the full
package-qualified name of the target bean class and appending "BeanInfo"
to form a new class name. If this fails, then we take the final
classname component of this name, and look for that class in each of the
packages specified in the BeanInfo package search path."
This search path is declared as (JDK1.4.0_03):
private static String[] searchPath = { "sun.beans.infos" };
A quick look into the rt.jar reveals, that there is a class
ComponentBeanInfo, which describes java.awt.Component java Bean. This
way, your component's real properties are never revealed to the
introspection mechanism.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--
Cheers,
Davide
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org