Ah, it seems the select component must recieve a list and not a set.
----- Original Message -----
From: John
To: [email protected]
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