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

Reply via email to