simon wrote:

On Mon, 2004-12-06 at 07:30, Mihai C. wrote:


Hi all, being new to digester, I have no clue how to get around my problem. Here's the story:
I'm trying to parse a config xml that looks like this:
<root>
<a>
.......
<b>
.....
</b>
<b>
.....
</b>
</a>
<a>
.......
<b>
.....
</b>
<b>
.....
</b>
</a>
</root>


I have two beans (ABean and BBean)
and the factory :
class Factory {
processA(ABean ab){
.......
}
processB(BBean bb){
........
}
digest(){
Digester d = new Digester();
d.push(this); //stack bottom
d.addSetNext( "root/a/b", "processB" , "BBean"); // when root/a/b pattern mathes, execute processB on 'this' with BBean type param
d.addSetNext( "root/a", "processA", "ABean"); // when root/a pattern mathes, execute processA on 'this' with ABean type param
d.addObjectCreate( "root/a", ABean.class);
d.addObjectCreate( "root/a/b", BBean.class);


     ............... //var addCallMethod()
}
}

I get this error:

[DEBUG] Digester - -[SetNextRule]{root/a/b} Call Factory.processB([EMAIL PROTECTED])
[ERROR] Digester - -End event threw exception <java.lang.IllegalArgumentException: argument type mismatch>java.lang.IllegalArgumentException: argument type mismatch









Obviously, processB() was called with the wrong arg type(ABean instead of BBean) and that because the BBean obj was just poped from the stack.



No, I think what is happening is that Digester is attempting to call a method processB(BBean) on an object of type ABean. The ABean class presumably doesn't have such a method.

The structure of your input xml implies that BBeans are children of
ABeans. But you appear to be trying to map this structure to a different
representation where ABean and BBean objects are children of a Factory
object. If you *really* want to do this, then I expect a way can be
found, but I doubt this is really what you want to achieve...

Remember that Digester has an object stack. You push an instance of
Factory on the stack initially. Then when an <a> tag is encountered,
your rules tell digester to create and push an ABean object onto the
stack, and call ProcessA on the (top-1) object (the Factory) passing the
top object (the ABean). All is ok so far. But then the <b> tag *within*
the <a> tag is encountered, so your rules tell Digester to create a
BBean object, push it on the stack, then call ProcessB on the (top-1)
object on the stack - which is an ABean. Now I think this probably *is*
what you want - the <b> tag is within the <a> tag, indicating that BBean
objects are children of ABean objects. So surely a method on the ABean
should be invoked to handle its children...


I hope this helps. If not, please provide a little more information on
why you don't want to map the input xml in the obvious manner..

Regards,

Simon


I agree with Simon that you probably don't want to do what you want to do.
But if you really want to, you can call addSetRoot(..) to do exactly what you describe.


Regards,
Matthijs.

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



Reply via email to