Odd that you lost your value; the field is itself persistent (@Persist).
Unless you are testing on a multi-machine cluster, you shouldn't see any
problems along these lines!

On 5/7/07, Joel Wiegman <[EMAIL PROTECTED]> wrote:

Impressive!  I was injecting that value via Spring to bootstrap it.
Makes sense I should have removed that...

No errors now...  However, the field doesn't appear to be binding on a
form submission.  The encoder and the model appear to be receiving and
returning the correct values, the brand getter and setter appear to be
getting called, and the dropdown renders correctly except that it always
appears to be reset to the default value...

I apologize for being so high-maintenance.  If there is a working
example of a T5 binding select box anywhere on the web, please point me
there and I will leave you alone!

Main.html

<t:form>
  <select t:type="select" class="mint_font_black_background"
t:id="brand"
    value="brand" model="brandSelectModel" encoder="brandValueEncoder"
    onchange="this.form.submit();" />
</t:form>


Main.java

public class Main {

        @Inject
        @SpringBean("enterprise")
        private Enterprise enterprise;

        @Persist
        private Brand brand;

        public Brand getBrand() {
                return brand;
        }

        public void setBrand(Brand brand) {
                this.brand = brand;
        }

        public BrandSelectModel getBrandSelectModel() {
                return new BrandSelectModel(enterprise.getBrands());
        }

        public BrandValueEncoder getBrandValueEncoder() {
                return new BrandValueEncoder(enterprise.getBrands());
        }

        public class BrandValueEncoder implements ValueEncoder<Brand> {

                private List<Brand> brands;

                public BrandValueEncoder(List<Brand> brands) {
                        this.brands = brands;
                }

                public String toClient(Brand brand) {
                        return brand.getDescription();
                }

                public Brand toValue(String string) {
                        for(Brand brand : brands) {

if(brand.getDescription().equals(string)) {
                                        return brand;
                                }
                        }
                        return null;
                }

        }

        public class BrandSelectModel implements SelectModel {

                private List<Brand> brands;

                public BrandSelectModel(List<Brand> brands) {
                        this.brands = brands;
                }

                public List<OptionGroupModel> getOptionGroups() {
                        return null;
                }

                public List<OptionModel> getOptions() {
                        List<OptionModel> optionModelList =
                                new ArrayList<OptionModel>();
                        for(Brand brand: brands) {
                                optionModelList.add(
                                  new OptionModelImpl(
                                        brand.getDescription(),
                                        false,
                                        brand,
                                        new String[0]
                                  )
                                );
                        }
                        return optionModelList;
                }

        }

}



-----Original Message-----
From: Howard Lewis Ship [mailto:[EMAIL PROTECTED]
Sent: Saturday, May 05, 2007 9:45 PM
To: Tapestry users
Subject: Re: T5: SelectModel - a real world example

What annotations are on the brand field of your Main class?  Something
has changes that field to be read-only, which is usually a sign that a
value was injected.

On 5/4/07, Joel Wiegman <[EMAIL PROTECTED]> wrote:
>
> Still getting unintuitive errors... I've added the ValueEncoder and
> now when I submit the form I get the following stack trace (and yes
> the "Main" component has a setBrand(Brand) method, which from the root

> cause exception seems to be the cause of the problem?):
>
> [ERROR] RequestExceptionHandler Processing of request failed with
> uncaught exception:
> org.apache.tapestry.ioc.internal.util.TapestryException: Failure
> writing parameter value of component com.foo.pages.Main:brand: Field
> com.foo.pages.Main.brand is read-only. [at context:WEB-INF/Main.html,
> line 89, column 278]
> java.lang.RuntimeException:
> org.apache.tapestry.ioc.internal.util.TapestryException: Failure
> writing parameter value of component com.foo.
> pages.Main:brand: Field com.foo.pages.Main.brand is read-only. [at
> context:WEB-INF/Main.html, line 89, column 278]
>         at
> org.apache.tapestry.corelib.components.Form.onAction(Form.java:356)
>         at
> org.apache.tapestry.corelib.components.Form.handleComponentEvent(Form.
> ja
> va)
>         at
> org.apache.tapestry.internal.structure.ComponentPageElementImpl.handle
> Ev
> ent(ComponentPageElementImpl.java:903)
>         at
> org.apache.tapestry.internal.structure.ComponentPageElementImpl.trigge
> rE
> vent(ComponentPageElementImpl.java:1002)
>         at
> org.apache.tapestry.internal.services.ActionLinkHandlerImpl.handle(Act
> io
> nLinkHandlerImpl.java:100)
>         at
> org.apache.tapestry.internal.services.ActionLinkHandlerImpl.handle(Act
> io
> nLinkHandlerImpl.java:53)
>         at
> $ActionLinkHandler_11258c2d07d.handle($ActionLinkHandler_11258c2d07d.j
> av
> a)
>         at
> org.apache.tapestry.internal.services.ComponentActionDispatcher.dispat
> ch
> (ComponentActionDispatcher.java:115)
>         ... 40 more
> Caused by: org.apache.tapestry.ioc.internal.util.TapestryException:
> Failure writing parameter value of component com.foo.pages.Main:brand:
> Field com.foo.pages.Main.brand is read-only. [at
> context:WEB-INF/Main.html, line 89, column 278]
>         at
> org.apache.tapestry.internal.structure.InternalComponentResourcesImpl.
> wr
> iteParameter(InternalComponentResourcesImpl.java:223)
>         at
> org.apache.tapestry.corelib.components.Select._$update_parameter_value
> _0
> (Select.java)
>         at
> org.apache.tapestry.corelib.components.Select.processSubmission(Select
> .j
> ava:238)
>         at
> org.apache.tapestry.corelib.base.AbstractField.processSubmission(Abstr
> ac
> tField.java:210)
>         at
>
org.apache.tapestry.corelib.base.AbstractField.access$100(AbstractField.
> java:47)
>         at
> org.apache.tapestry.corelib.base.AbstractField$ProcessSubmissionAction
> .e
> xecute(AbstractField.java:116)
>         at
> org.apache.tapestry.corelib.base.AbstractField$ProcessSubmissionAction
> .e
> xecute(AbstractField.java:110)
>         at
> org.apache.tapestry.corelib.components.Form.onAction(Form.java:347)
>         ... 40 more
> Caused by: org.apache.tapestry.ioc.internal.util.TapestryException:
> Field com.foo.pages.Main.brand is read-only. [at context:WEB-INF/Main.
> html, line 89, column 278]
>         at
> org.apache.tapestry.internal.bindings.PropBinding.set(PropBinding.java
> :7
> 1)
>         at
> org.apache.tapestry.internal.structure.InternalComponentResourcesImpl.
> wr
> iteParameter(InternalComponentResourcesImpl.java:219)
>         ... 47 more
> Caused by: java.lang.RuntimeException: Field com.foo.pages.Main.brand
> is read-only.
>         at com.foo.pages.Main._$write_brand(Main.java)
>         at com.foo.pages.Main.setBrand(Main.java:92)
>         at
> $PropertyConduit_11258c2d0a9.set($PropertyConduit_11258c2d0a9.java)
>         at
> org.apache.tapestry.internal.bindings.PropBinding.set(PropBinding.java
> :6
> 7)
>         ... 48 more
>
>
>
> -----Original Message-----
> From: Howard Lewis Ship [mailto:[EMAIL PROTECTED]
> Sent: Friday, May 04, 2007 2:32 PM
> To: Tapestry users
> Subject: Re: T5: SelectModel - a real world example
>
> In your OptionModel, the label is the Brand description, and the value

> is the Brand itself.
>
> You then supply a ValueEncoder that converts between Brands and brand
> ids (as strings, for the client side). If Brand is an entity object,
> then it may be necessary to have the ValueEncoder talk to the database

> or session store.
>
> On 5/4/07, Joel Wiegman <[EMAIL PROTECTED]> wrote:
> >
> > Thanks for the reply Howard.
> >
> > >> The Select component doesn't know how to create a client-side
> > representation of a Brand (it doesn't magically know to use the id).
> >
> > So, then... I guess my question would be... what is the
> > BrandSelectModel for?  In that object, I'm essentially mapping a
> > Brand's "description" to the Brand object.
> >
> > Just curious what your thoughts are on that...
> >
> >
> > -----Original Message-----
> > From: Howard Lewis Ship [mailto:[EMAIL PROTECTED]
> > Sent: Friday, May 04, 2007 1:42 PM
> > To: Tapestry users
> > Subject: Re: T5: SelectModel - a real world example
> >
> > In the simplest case, T5 thinks that the options in the drop down
> > list
>
> > are all strings.
> >
> > In your case, they are Brands.  The Select component doesn't know
> > how to create a client-side representation of a Brand (it doesn't
> > magically know to use the id).
> >
> > You must provide a ValueEncoder that can convert between Brands and
> > client-side string values.  This is the encoder parameter of the
> > Select component.
> >
> >
> > On 5/4/07, Joel Wiegman <[EMAIL PROTECTED]> wrote:
> > >
> > > Not to be harsh, but I don't think I've ever written a select box
> > > with
> >
> > > constant values (Enum).  Seems like even Male/Female drop downs
> > > need
>
> > > to be data-driven now-a-days.  :->
> > >
> > > I've started to stub out a very simple "real world example" of a
> > > select component in T5, but it doesn't appear to be as simple as I

> > > thought it would be.
> > >
> > > A shiny nickel to anyone that can spot the flaw, because I sure
> > can't...
> > > I'm new to Tapestry in general so I could be missing something
> > > really mundane here, but seems like it should work in my mind.
> > >
> > > Here are the players:
> > >
> > > << THE ERROR >>
> > >
> > > [ERROR] DefaultRequestExceptionHandler Processing of request
> > > failed with uncaught exception: com.foo.data.Brand cannot be cast
> > > to java.lang.String
> > > java.lang.ClassCastException: com.foo.data.Brand cannot be cast to

> > > java.lang.String
> > >         at
> > >
> > org.apache.tapestry.corelib.components.Select$1.toClient(Select.java
> > :6
> > 2)
> > >         at
> > > org.apache.tapestry.corelib.components.Select.writeOptions(Select.
> > > ja
> > > va
> > > :1
> > > 94)
> > >         at
> > >
> org.apache.tapestry.corelib.components.Select.options(Select.java:169)
> > >         at
> > > org.apache.tapestry.corelib.components.Select.beforeRenderTemplate
> > > (S
> > > el
> > > ec
> > > t.java)
> > >
> > >
> > > << Main.html (abridged) >>
> > >
> > > <t:form>
> > >         <select t:type="select" t:id="brand" value="brand"
> > > model="brandSelectModel"/>
> > > </t:form>
> > >
> > >
> > > << Main.java (abridged) >>
> > >
> > > package com.foo.pages;
> > >
> > > import com.foo.data.Brand;
> > >
> > > public class Main {
> > >
> > >         private Brand brand;
> > >
> > >         public Brand getBrand() {
> > >                 return brand;
> > >         }
> > >
> > >         public void setBrand(Brand brand) {
> > >                 this.brand = brand;
> > >         }
> > >
> > >         public BrandSelectModel getBrandSelectModel() {
> > >                 return new BrandSelectModel(getBrands());
> > >         }
> > >
> > >         public List<Brand> getBrands() {
> > >                 List<Brand> brands = new ArrayList<Brand>();
> > >                 brands.add(new Brand("1", "Brand 1"));
> > >                 brands.add(new Brand("2", "Brand 2"));
> > >                 brands.add(new Brand("3", "Brand 3"));
> > >                 return brands;
> > >         }
> > >
> > > }
> > >
> > >
> > > << Brand.java (abridged) >>
> > >
> > > package com.foo.data;
> > >
> > > public class Brand {
> > >
> > >         private String id;
> > >         private String description;
> > >
> > >         public Brand() {}
> > >
> > >         public Brand(String id, String description) {
> > >                 this.id = id;
> > >                 this.description = description;
> > >         }
> > >
> > >         public String getId() {
> > >                 return id;
> > >         }
> > >
> > >         public String getDescription() {
> > >                 return description;
> > >         }
> > >
> > > }
> > >
> > >
> > > << BrandSelectModel.java >>
> > >
> > > package com.foo.uisupport;
> > >
> > > import com.foo.data.Brand;
> > >
> > > public class BrandSelectModel implements SelectModel {
> > >
> > >         private List<Brand> brands;
> > >
> > >         public BrandSelectModel(List<Brand> brands) {
> > >                 this.brands = brands;
> > >         }
> > >
> > >         public List<OptionGroupModel> getOptionGroups() {
> > >                 return null;
> > >         }
> > >
> > >         public List<OptionModel> getOptions() {
> > >                 List<OptionModel> optionModelList = new
> > > ArrayList<OptionModel>();
> > >                 for(Brand brand: brands) {
> > >                         optionModelList.add(new
> > > OptionModelImpl(brand.getDescription(), false, brand, new
> String[0]));
> > >                 }
> > >                 return optionModelList;
> > >         }
> > >
> > > }
> > >
> > >
> > >
> > > ------------------------------------------------------------------
> > > --
> > > - To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> >
> >
> > --
> > Howard M. Lewis Ship
> > TWD Consulting, Inc.
> > Independent J2EE / Open-Source Java Consultant Creator and PMC
> > Chair, Apache Tapestry Creator, Apache HiveMind
> >
> > Professional Tapestry training, mentoring, support and project work.
> > http://howardlewisship.com
> >
> > --------------------------------------------------------------------
> > - To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
>
> --
> Howard M. Lewis Ship
> TWD Consulting, Inc.
> Independent J2EE / Open-Source Java Consultant Creator and PMC Chair,
> Apache Tapestry Creator, Apache HiveMind
>
> Professional Tapestry training, mentoring, support and project work.
> http://howardlewisship.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>


--
Howard M. Lewis Ship
TWD Consulting, Inc.
Independent J2EE / Open-Source Java Consultant Creator and PMC Chair,
Apache Tapestry Creator, Apache HiveMind

Professional Tapestry training, mentoring, support and project work.
http://howardlewisship.com

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




--
Howard M. Lewis Ship
TWD Consulting, Inc.
Independent J2EE / Open-Source Java Consultant
Creator and PMC Chair, Apache Tapestry
Creator, Apache HiveMind

Professional Tapestry training, mentoring, support
and project work.  http://howardlewisship.com

Reply via email to