Hi William,

On Wed, 2005-01-19 at 02:49 -0600, William Fuller wrote:
> Hello, I'm new to Digester, Tomcat, Servlet, Velocity, and even Java...
> Yup, one of those.

No worries, we've all been there..

> 
> I am running into a spot of bother while using Digester to parse my XML file
> that I will ultimately pluck from Derby.  The file starts out like this:
> 
> 
> <Screen>
>  <ScreenID>3220D03D-59F7-49ca-86AE-E97B7427BA7B</ScreenID>
>     <Lifetime_ms>20000</Lifetime_ms>
>  <BugItem>
>         <ImageURL>cnn001.jpg</ImageURL>
>         ...
> 
> It is a rather large file with many Vectors and I parse it just fine so long
> as all the setMethods are of type String.  I am using XML Rules and my file
> looks like this:
> 
> <?xml version="1.0"?>
> 
> <digester-rules>
>     <pattern value="Screen">
>         <object-create-rule classname="com.synergy.screendoc.ScreenDocument"
> />
>         <call-method-rule pattern="ScreenID" methodname="setScreenID"
> paramcount="0" />
>         <call-method-rule pattern="Lifetime_ms" methodname="setLifetime_ms"
> paramcount="0" />
> ...
> 
> My Java bean for the first level looks like this:
> 
> public class ScreenDocument
> {
>     public  String  ScreenID;
>     public  String  Lifetime_ms;
>     public  Vector  BugItem;
>     public  Vector  StaticTextItem;
>     public  Vector  DynamicTextItem;
> 
>     public ScreenDocument()
>     {
>         BugItem         = new Vector();
>         StaticTextItem  = new Vector();
>         DynamicTextItem = new Vector();
>     }
> 
>     public String getScreenID() { return ScreenID; }
>     public void setScreenID( String rhs ) { this.ScreenID = rhs; }
>     public String getLifetime_ms() { return Lifetime_ms; }
>     public void setLifetime_ms( String rhs ) { this.Lifetime_ms = rhs; }
>     ...

If I understand your problem, your issue is that this works when
property Lifetime_ms is a String, but you want it to be an int or
Integer?

Well, this should just work. Digester uses BeanUtils to access
properties of a Java object, and this automatically does type
conversions. From inspection of the target ScreenDocument class,
BeanUtils should see that there is a setScreenID(int rhs) method, and so
automatically convert String->int before invoking that method. If the
getter/setter deal in Integer rather than int, then that should work
too.

A few suggestions:
(a) Did you change the prototype of the getScreenID method to return the
same datatype as the setScreenID takes as a parameter? This is required
by the JavaBean standard...
(b) If you're still having problems then you can try enabling debugging
in Digester. See http://wiki.apache.org/jakarta-commons/Digester/FAQ
section 1.4.

> 
> The problem that I am encountering is that if I try to use
> bean-property-setter-rule like this:
> 
> <?xml version="1.0"?>
> 
> <digester-rules>
>     <pattern value="Screen">
>         <object-create-rule classname="com.synergy.screendoc.ScreenDocument"
> />
>         <set-properties-rule/>
>         <bean-property-setter-rule pattern="ScreenID"/>
>         <bean-property-setter-rule pattern="Lifetime_ms"/>
> 
> I get the Digester exception that the bean has no property ScreenID.
> 
> Having a method that works I would normally just blow this off, but I don't
> really want Lifetime_ms to be a String, I want it to be an "int".  I would
> be happy with it being a java.lang.Integer, but when I do something like
> this:
> 
> <?xml version="1.0"?>
> 
> <digester-rules>
>     <pattern value="Screen">
>         <object-create-rule classname="com.synergy.screendoc.ScreenDocument"
> />
>         <call-method-rule pattern="ScreenID" methodname="setScreenID"
> paramcount="0" />
>         <pattern value="Lifetime_ms">
>             <call-method-rule methodname="setLifetime_ms" paramcount="1"/>
>             <object-param-rule paramnumber='0' type="java.lang.Integer" />
>         </pattern>
>         ...
> 
> And change the bean to have Lifetime_ms defined, set, and returned as type
> Integer, Digester throws and exception and complains that setLifetime_ms is
> not defined in my class.
> 
> I am at a loss for understanding why I am having this problem and suspect I
> am doing something really dumb.
> 
> Can anyone please set me staight?

I'm puzzled as well. It should all work. The only thing that I can think
of is that you failed to change the getter method [as described in (a)
above].

If this isn't the case, then please enable debugging and have a look at
the output. If this still doesn't help, then post the debug output to
this list and maybe I (or someone else) can help further.

Regards,

Simon



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

Reply via email to