On Thu, 6 Feb 2003, Maher Martin wrote:

> Date: Thu, 6 Feb 2003 16:20:58 +0100
> From: Maher Martin <[EMAIL PROTECTED]>
> Reply-To: Jakarta Commons Users List <[EMAIL PROTECTED]>
> To: "'[EMAIL PROTECTED]'" <[EMAIL PROTECTED]>
> Subject: Digester Problem related to Bean Classname
>
> Hi,
>
> I've encountered a strange problem with Digester which is related to the
> name of the java bean class. If I name the Java class "x.y.Component" then
> the <set-properties-rule /> fails to call the setter methods for the bean
> class. However if I rename the class to "x.y.Component2" all setters are
> invoked by Digester when parsing the XML.
>
> Can anybody explain what's going on here? I've included examples below.
>

This is going to take a few paragraphs, but here goes ...

Digester (and beanutils, for that matter) use Java's introspection
capabilities (java.beans.Introspector) to find the available methods and
properties of bean classes.  Normally, properties are identified by the
naming pattern used on the methods (getFoo() and setFoo()), but you can
also override this if you provide a BeanInfo class associated with your
bean class (see the Introspector Javadocs and the JavaBeans Specification
for more info).

Now, there are two ways to associate a BeanInfo class with your bean:

* Put it in the same package as your bean class, with the same
  classname + BeanInfo on the end (for a bean MyBean, the corresponding
  class would be MyBeanBeanInfo).

* Tell the introspector to use a particular "search path" (set of
  package names) to search in for BeanInfo classes.

Unfortunately, the default search path in the JDK includes a directory
that contains a class named ComponentBeanInfo -- which tells the
introspector that any class named "Component" will use this BeanInfo class
to identify its properties, rather than looking at the methods of your
class.  Thus, *your* properties are not recognized.

There's two workarounds:

* Name your class anything other than "Component".  (This seems
  to be the only BeanInfo class available in the default JDK list)

* Call Introspector.setBeanInfoSearchPath() to set a different
  set of search directories, before using Digester.

> Best Regards
>
> Martin Maher
>

Craig McClanahan


> ------ Component Class --------
>
> package x.y
>
> public class Component {
>
>   private int _number;
>   private String _type;
>
>   public Component() {
>   }
>
>   public void setNumber(int number) {
>     _number = number;
>   }
>
>   public void setType(String type) {
>     _type = type;
>   }
>
>   public int getNumber() {
>     return _number;
>   }
>
>   public String getType() {
>     return _type;
>   }
>
>   public String toString() {
>     String newline = System.getProperty("line.separator");
>     StringBuffer sBuf = new StringBuffer();
>
>     sBuf.append("Number:").append(_number).append(newline);
>     sBuf.append("Type:").append(_type).append(newline);
>
>     return sBuf.toString();
>   }
>
> }
>
> ------INPUT XML FILE--------
>
> <?xml version="1.0"?>
>
> <component number="1" type="a">
> </component>
>
> ------ XML RULES --------
>
> <?xml version="1.0"?>
>
> <digester-rules>
>
>       <pattern value="component">
>               <object-create-rule classname="x.y.Component" />
>               <set-properties-rule />
>       </pattern>
>
> </digester-rules>
> --------------
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

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

Reply via email to