Me too Jan, thank you. I was also passing a list via the template loop component attribute 'source' as well, and I was also wrapping it with ${} - I've obviously spent too long using the JSP EL! This would be a good gotcha to add to the wiki or even possibly the T5 documentation...?
Anyway it looks like I was completely wrong about the loop component then. I could still use an explanation of volatility & forms though if anyone can point me in the right direction. > -----Original Message----- > From: Jan Vissers [mailto:[EMAIL PROTECTED] > Sent: 18 April 2008 16:06 > To: Tapestry users > Subject: Re: Could not find a coercion from type java.lang.String to > type com.****.lighting.guidecontrol.view.BreadcrumbBean > > Spot on! Now I also understand why the .tml passing didn't work. This > is > a great 'a-ha' moment for me! > > -J. > On Fri, 2008-04-18 at 17:03 +0200, Chris Lewis wrote: > > Ok I think I see the problem. In your layout replace this: > > > > t:breadCrumbs="${basePage.breadCrumbHolder.model}" > > > > with this: > > > > t:breadCrumbs="basePage.breadCrumbHolder.model" > > > > Notice the lack of ${}. ${} is trying to convert it to a string, > which > > it's not. When passing params to components you don't use expansions, > > what you want is the object property from the class. The default > binding > > prefix for params is "prop" which is what you want in this case. > > > > Jan Vissers wrote: > > > I think I'm getting a bit further now - sorry to spam this list by > the > > > way... > > > > > > If I pass the breadCrumb model in the Component class instead via > the > > > Component Template something is happening. > > > > > > So instead of: > > > <t:heading t:id="heading" > > > t:breadCrumbs="${basePage.breadCrumbHolder.model}" /> > > > > > > I do in .java > > > @Component(inheritInformalParameters = true, parameters = > > > { > "loginPage=inherit:loginPage","breadCrumbs=basePage.breadCrumbHolder.mo > del" }) > > > > > > > > > > > > On Fri, 2008-04-18 at 16:47 +0200, Jan Vissers wrote: > > > > > >> The layout component that passes in the 'breadCrumb' model to the > > >> 'heading' component which should render the breadcrumbs... > > >> > > >> > > >> <?xml version="1.0" encoding="utf-8"?> > > >> <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" > > >> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> > > >> <html xmlns="http://www.w3.org/1999/xhtml" > > >> xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> > > >> <head> > > >> <meta http-equiv="Content-Type" > > >> content="text/html;charset=utf-8" /> > > >> <link rel="shortcut icon" href="favicon.ico" /> > > >> <title>${title}</title> > > >> </head> > > >> <body> > > >> <div id="container"> > > >> <t:branding t:id="branding" /> > > >> <t:heading t:id="heading" > > >> t:breadCrumbs="${basePage.breadCrumbHolder.model}" /> > > >> <t:body /> > > >> <t:copyright t:id="copyright" /> > > >> </div> > > >> </body> > > >> </html> > > >> > > >> On Fri, 2008-04-18 at 16:43 +0200, Chris Lewis wrote: > > >> > > >>> And that is the part I want to see, from the template code which > you > > >>> still haven't shared ;-). What I'm referring to is your .tml file > where > > >>> you use this component. > > >>> > > >>> Jan Vissers wrote: > > >>> > > >>>> In the snippet below if I change: > > >>>> public List<BreadcrumbBean> getBreadCrumbs() > > >>>> > > >>>> and let it return a freshly created list. The loop construct > works. > > >>>> However via the @Parameter (passing it it) doesn't. > > >>>> > > >>>> -J. > > >>>> > > >>>> > > >>>> On Fri, 2008-04-18 at 16:27 +0200, Jan Vissers wrote: > > >>>> > > >>>> > > >>>>> Here it is: > > >>>>> > > >>>>> import java.util.List; > > >>>>> > > >>>>> import org.apache.log4j.Logger; > > >>>>> import org.apache.tapestry.annotations.Parameter; > > >>>>> > > >>>>> import com.philips.lighting.guidecontrol.view.BreadcrumbBean; > > >>>>> > > >>>>> /** > > >>>>> * The heading component holds the following pieces of Heading > > >>>>> information. > > >>>>> * > > >>>>> * <pre> > > >>>>> * <div id="heading"> > > >>>>> * <ul id="breadcrumbs"> > > >>>>> * <li > > >>>>> id="prefix">[ &aposyou-are-here&apos > ]>/li> > > >>>>> * { when loginPage } > > >>>>> * <li>&aposlogin- > page&apos</li> > > >>>>> * { when not loginPage } > > >>>>> * { for all crumbs } > > >>>>> * { if crumb is last } > > >>>>> * <li>[ crumb text ]</li> > > >>>>> * { if crumb is not last } > > >>>>> * <li><a href="[ crumb > > >>>>> link ]">[ crumb text ]</a> > </li> > > >>>>> * </ul> > > >>>>> * </div> > > >>>>> * </pre> > > >>>>> * > > >>>>> * @author Cumquat Information Technology > > >>>>> * > > >>>>> */ > > >>>>> public class Heading { > > >>>>> private static final Logger logger = > > >>>>> Logger.getLogger(Heading.class); > > >>>>> > > >>>>> @Parameter > > >>>>> private boolean loginPage = false; > > >>>>> > > >>>>> @Parameter > > >>>>> private List<BreadcrumbBean> breadCrumbs; > > >>>>> > > >>>>> private int index; > > >>>>> > > >>>>> private BreadcrumbBean crumb; > > >>>>> > > >>>>> public boolean isLoginPage() { > > >>>>> return loginPage; > > >>>>> } > > >>>>> > > >>>>> public List<BreadcrumbBean> getBreadCrumbs() { > > >>>>> return breadCrumbs; > > >>>>> } > > >>>>> > > >>>>> public void setBreadCrumbs(List<BreadcrumbBean> > breadCrumbs) { > > >>>>> logger.debug("Setting breadcrumbs: "+breadCrumbs); > > >>>>> this.breadCrumbs = breadCrumbs; > > >>>>> } > > >>>>> > > >>>>> public int getIndex() { > > >>>>> return index; > > >>>>> } > > >>>>> > > >>>>> public void setIndex(int index) { > > >>>>> this.index = index; > > >>>>> } > > >>>>> > > >>>>> public BreadcrumbBean getCrumb() { > > >>>>> return crumb; > > >>>>> } > > >>>>> > > >>>>> public void setCrumb(BreadcrumbBean crumb) { > > >>>>> this.crumb = crumb; > > >>>>> } > > >>>>> > > >>>>> public boolean isLastCrumb() { > > >>>>> return (index == breadCrumbs.size() - 1); > > >>>>> } > > >>>>> > > >>>>> } > > >>>>> > > >>>>> On Fri, 2008-04-18 at 16:22 +0200, Chris Lewis wrote: > > >>>>> > > >>>>> > > >>>>>> We still haven't seen your template code, where you declare > this > > >>>>>> component and pass it the model. I can't be sure but perhaps > it will > > >>>>>> shed some light... > > >>>>>> > > >>>>>> Jan Vissers wrote: > > >>>>>> > > >>>>>> > > >>>>>>> The problem is somehow related to the way my page and > component are > > >>>>>>> hooked up/working. > > >>>>>>> > > >>>>>>> For testing purposes I now create the Breadcrumb list in the > component > > >>>>>>> itself, simply returning a created list on the fly whenever > > >>>>>>> getBreadCrumbs() is called. This works as expected!!! > > >>>>>>> > > >>>>>>> Strange thing is that via passing the 'model' to the > component via a > > >>>>>>> page binding the same thing doesn't work. This must be a > bug?! > > >>>>>>> > > >>>>>>> -J. > > >>>>>>> > > >>>>>>> On Fri, 2008-04-18 at 15:59 +0200, Chris Lewis wrote: > > >>>>>>> > > >>>>>>> > > >>>>>>> > > >>>>>>>> That looks good to me. I don't have an example I can look at > with a > > >>>>>>>> loop, but I do have one with a t:grid in which I reference a > bean > > >>>>>>>> property of a custom class. It's possible that the two are > vastly > > >>>>>>>> different, but I wouldn't think that. > > >>>>>>>> > > >>>>>>>> Jan Vissers wrote: > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>>> On the component I have: > > >>>>>>>>> > > >>>>>>>>> @Parameter > > >>>>>>>>> private List<BreadcrumbBean> breadCrumbs; > > >>>>>>>>> > > >>>>>>>>> This is passed in via the containg (base)page. > > >>>>>>>>> And in the same component class I have: > > >>>>>>>>> > > >>>>>>>>> private BreadcrumbBean crumb; > > >>>>>>>>> > > >>>>>>>>> public BreadcrumbBean getCrumb() { > > >>>>>>>>> return crumb; > > >>>>>>>>> } > > >>>>>>>>> > > >>>>>>>>> public void setCrumb(BreadcrumbBean crumb) { > > >>>>>>>>> this.crumb = crumb; > > >>>>>>>>> } > > >>>>>>>>> > > >>>>>>>>> This should be right, right? > > >>>>>>>>> > > >>>>>>>>> -J. > > >>>>>>>>> > > >>>>>>>>> On Fri, 2008-04-18 at 14:00 +0100, nicholas Krul wrote: > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>>> ? is your crumb property of type BreadCrumbBean, or is it > type String? > > >>>>>>>>>> should be same as breadCrumbs<?TYPE> > > >>>>>>>>>> > > >>>>>>>>>> On Fri, Apr 18, 2008 at 1:56 PM, Chris Lewis > <[EMAIL PROTECTED]> > > >>>>>>>>>> wrote: > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>>> I can't speak about your t:if bit because I don't know > what "LastCrumb" > > >>>>>>>>>>> would be, but assuming that your page class has > getters/setters (or the > > >>>>>>>>>>> property is annotated with @Property) for the "crumb" > property, a getter > > >>>>>>>>>>> for your "breadCrumbs," and your crumb bean defines a > "getName" method, > > >>>>>>>>>>> you *should* be good. > > >>>>>>>>>>> > > >>>>>>>>>>> It would be helpful if you can include the exception, > specifically the > > >>>>>>>>>>> line it references, etc. > > >>>>>>>>>>> > > >>>>>>>>>>> chris > > >>>>>>>>>>> > > >>>>>>>>>>> PS the list is good, the IRC channel (irc.freenode.net > #tapestry) is > > >>>>>>>>>>> better ;-) > > >>>>>>>>>>> > > >>>>>>>>>>> Jan Vissers wrote: > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>>> Yep, sure, I may I add - This mailing list is great and > Tapestry rocks! > > >>>>>>>>>>>> > > >>>>>>>>>>>> <t:loop source="breadCrumbs" value="crumb" > index="index"> > > >>>>>>>>>>>> <t:if test="LastCrumb"> > > >>>>>>>>>>>> ${crumb.name} > > >>>>>>>>>>>> <t:parameter name="else"> > > >>>>>>>>>>>> <a href="#" > > >>>>>>>>>>>> t:type="pageLink" ....>${crumb.name}</a> > > >>>>>>>>>>>> > > > >>>>>>>>>>>> </t:parameter> > > >>>>>>>>>>>> </t:if> > > >>>>>>>>>>>> </t:loop> > > >>>>>>>>>>>> > > >>>>>>>>>>>> -J. > > >>>>>>>>>>>> > > >>>>>>>>>>>> On Fri, 2008-04-18 at 14:34 +0200, Chris Lewis wrote: > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>>> Can you share some code? At least the relevant part > from template would > > >>>>>>>>>>>>> be helpful. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> chris > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Jan Vissers wrote: > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>>> Hi, > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Just to make sure I'm not missing something. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> In T4 when I wrote a @For construct I could use > value="..." as long as > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>> I > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>>>>> provided a setter|getter pair for the class involved - > in this case > > >>>>>>>>>>>>>> BreadcrumbBean. I want to iterate over a list of beans > and use each > > >>>>>>>>>>>>>> instance individually. Now T5 throws up on me with > this nice coercion > > >>>>>>>>>>>>>> message. Does this mean I need to contribute my own > coercion - or is > > >>>>>>>>>>>>>> there a more simple way? In my case BreadcrumbBean is > a simple class > > >>>>>>>>>>>>>> holding three String members. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Thanks (again :-)) > > >>>>>>>>>>>>>> -J. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> ------------------------------------------------------ > --------------- > > >>>>>>>>>>>>>> To unsubscribe, e-mail: users- > [EMAIL PROTECTED] > > >>>>>>>>>>>>>> For additional commands, e-mail: users- > [EMAIL PROTECTED] > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>> -------------------------------------------------------- > ------------- > > >>>>>>>>>>>> To unsubscribe, e-mail: users- > [EMAIL PROTECTED] > > >>>>>>>>>>>> For additional commands, e-mail: users- > [EMAIL PROTECTED] > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>> -- > > >>>>>>>>>>> http://thegodcode.net > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>> ----------------------------------------------------------- > ---------- > > >>>>>>>>> To unsubscribe, e-mail: users- > [EMAIL PROTECTED] > > >>>>>>>>> For additional commands, e-mail: users- > [EMAIL PROTECTED] > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>> ------------------------------------------------------------- > -------- > > >>>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED] > > >>>>>>> For additional commands, e-mail: users- > [EMAIL PROTECTED] > > >>>>>>> > > >>>>>>> > > >>>>>>> > > >>>>>>> > > >>>>>>> > > >>>>> --------------------------------------------------------------- > ------ > > >>>>> 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] > > >>>> > > >>>> > > >>>> > > >>>> > > >> ------------------------------------------------------------------ > --- > > >> 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] > > > > > > > > > > > > > > --------------------------------------------------------------------- > 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]