Ah, it seems the select component must recieve a list and not a set. ----- Original Message ----- From: John To: users@tapestry.apache.org Sent: Thursday, September 25, 2014 8:51 AM Subject: select component error java.lang.String cannot be cast to
Rendering a select component results in an exception. I have had to wrap the underlying class to implement the string I want to represent the entity in question, so maybe that has something to do with this issue, but the stack dump doesn't shed enough light. It looks like toClient is passed a string and not the class instance? John pages.EmbWizard Render queue error in BeforeRenderTemplate[EmbWizard:wizard.venueworkchooser.pricelistitem]: java.lang.String cannot be cast to com.acme.webapps.bb.components.VenueWorkChooser$PriceListItemOption org.apache.tapestry5.ioc.internal.util.TapestryException: java.lang.String cannot be cast to com.acme.webapps.bb.components.VenueWorkChooser$PriceListItemOption [at classpath:com/acme/webapps/bb/components/VenueWorkChooser.tml, line 19] at org.apache.tapestry5.internal.structure.ComponentPageElementImpl$AbstractPhase.invoke(ComponentPageElementImpl.java:158) at org.apache.tapestry5.internal.structure.ComponentPageElementImpl$BeforeRenderTemplatePhase.render(ComponentPageElementImpl.java:264) at org.apache.tapestry5.internal.services.RenderQueueImpl.run(RenderQueueImpl.java:72) at org.apache.tapestry5.internal.services.PageRenderQueueImpl.render(PageRenderQueueImpl.java:124) at $PageRenderQueue_2c8b41df35ab4.render(Unknown Source) at $PageRenderQueue_2c8b41df35aa7.render(Unknown Source) at org.apache.tapestry5.internal.services.MarkupRendererTerminator.renderMarkup(MarkupRendererTerminator.java:37) ... at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:520) Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to com.acme.webapps.bb.components.VenueWorkChooser$PriceListItemOption at com.acme.webapps.bb.components.VenueWorkChooser$PriceListItemEncoder.toClient(VenueWorkChooser.java:508) at org.apache.tapestry5.internal.util.SelectModelRenderer.option(SelectModelRenderer.java:51) at org.apache.tapestry5.util.AbstractSelectModel.visitOptions(AbstractSelectModel.java:54) at org.apache.tapestry5.util.AbstractSelectModel.visit(AbstractSelectModel.java:46) at org.apache.tapestry5.corelib.components.Select.options(Select.java:297) at org.apache.tapestry5.corelib.components.Select.beforeRenderTemplate(Select.java) at org.apache.tapestry5.internal.structure.ComponentPageElementImpl$BeforeRenderTemplatePhase.invokeComponent(ComponentPageElementImpl.java:257) at org.apache.tapestry5.internal.structure.ComponentPageElementImpl$AbstractPhase.invoke(ComponentPageElementImpl.java:148) ... 90 more [WARN] TapestryModule.ComponentRequestHandler handlePageRender()Render queue error in BeforeRenderTemplate[EmbWizard:wizard.venueworkchooser.pricelistitem]: java.lang.String cannot be cast to com.acme.webapps.bb.components.VenueWorkChooser$PriceListItemOption <div t:type="if" t:test="priceListItems"> <t:form t:zone="^"> <t:select t:id="priceListItem" t:model="priceListItems" t:encoder="priceListItemEncoder" t:value="priceListItem" t:zone="venueChooserZone" t:blankOption="NEVER" class="chooser"/> </t:form> </div> public Set<PriceListItemOption> getPriceListItems() throws IllegalSessionStateException { String currentLocality = selectedLocality != null? selectedLocality : getPageCollections().localities.keySet().iterator().next(); return getPageCollections().priceListItems.get(currentLocality); } private class PriceListItemOption extends PriceListItem { public PriceListItemOption(int seq, int workId, int venueId, String description, String info, int duration, String locality, BigDecimal price, char ccode) { super(seq, workId, venueId, description, info, duration, locality, price, ccode); } @Override public String toString() { return getDurationAsString(getDuration()) + " " + getDescription() + " " + getCcode() + getPrice(); } } private class PriceListItemEncoder implements ValueEncoder<PriceListItemOption> { @Override public String toClient(PriceListItemOption option) { Integer id = option.getWorkId(); return id == null ? null : id.toString(); } @Override public PriceListItemOption toValue(String idAsString) { Integer workId = Integer.valueOf(idAsString); try { for (PriceListItemOption option : getPageCollections().priceListItems.get(selectedLocality)) { if (option.getWorkId() == workId) { return option; } } } catch (IllegalSessionStateException ex) { throw new RuntimeException(ex); } return null; } } } --- This email is free from viruses and malware because avast! Antivirus protection is active. http://www.avast.com --- This email is free from viruses and malware because avast! Antivirus protection is active. http://www.avast.com