Chris is correct you need some kind of type coachers to store Street in the url but in this case I don't think you need street/streets in the url only the variables in the form. I don't do much ajax so I like to use setupRender but perhaps the best way to get the set of streets is with a method like
@Cached public Set<Street> getStreets() { Set<Street> streets = new HashSet(); ... return streets; } This way it's created when needed and the @Chached will cache it during the current request. This works for ajax/forms whatever. Using @Persist on the streets field and doing the query in onSucess will work but persists the query data in the session. If you do this a lot it will eventually become a problem. On Wednesday, April 27, 2016, Chris Poulsen <mailingl...@nesluop.dk> wrote: > When you need to persist non-trivial state (and not want to put it in the > session, like standard @Persist does), you need to help tapestry figure out > how to map between a String and the persistent state. > > There are some coercers for the most trivial types and projects like > tapestry-hibernate/jpa also automatically let tapestry know how to map > between String and Entity instances. > > Some tapestry components allows you to register an encoder for the mapping > back and forth and on some pages you might need to perform the mapping > manually ( using activate/passivate ) > > Barry suggested a variation of this (because the parameter he passes is a > String which requires no further translation) and then you have the chance > to initialize "users" prior to rendering. > > Beware that setupRender phase is not always executed; ajax requests, form > submissions etc. may bypass it - Activate is always performed - So one > should be careful about the amount of work performed during activation. > > > > And Tapestry thinks "model.Street$0040141f225" is a String but it should > be > > a Bean. > > > > I tried adding Serializable on my Street bean but it doesn't change the > > error. > > As tapestry does not know how to map from your "Street" instance to a > String, if attempts to use the ordinary Java toString(), probably resulting > in something like "Street@141f225" and when this string is passed back in, > it has no chance of getting back to the correct Street instance. > > A ValueEncoder<Street> could probably do this for you automatically (you > have to let it know how to map from your instance to a String and back > again). > > Another possibility is to remove the @Activation* parameters and perform > the mapping in the page activate/passivate methods. > > HTH. > > -- > Chris > > > > On Wed, Apr 27, 2016 at 8:20 AM, Morgan Hautman <morgan.haut...@gmail.com > <javascript:;>> > wrote: > > > Hi, > > > > I didn't managed to get it work with @ActivationRequestParameter. > > I tried everything out and the last try was with @Persist and it worked, > so > > I'm keeping that because nothing else works.. > > > > Thank you all. > > > > Regards, > > Morgan > > > > 2016-04-26 13:06 GMT+02:00 Barry Books <trs...@gmail.com <javascript:;> > >: > > > > > Sorry my previous response a bit short. I was on my phone. Something > like > > > this hibernate example should work. It's better to store the query > > > parameters in the URL instead of the session. If you use the session > > > returning to the page will rerun the last query which seems a bit weird > > for > > > a web app. All the work is done in setupRender instead of onSuccess > > because > > > onSuccess ends with a redirect so no page is rendered. > > > > > > @Property > > > List<User> users; > > > > > > @Property > > > @ActivationRequestParameter > > > String lastName; > > > > > > @Inject > > > Session session; > > > > > > @SetupRender > > > void setupRender() { > > > if ( lastName != null ) { > > > users = session.createQuery(" from User where lastName = > > > :lastName").setParameter("lastName",lastName).list(); > > > } > > > } > > > > > > > > > > > > > > > On Tuesday, April 26, 2016, Morgan Hautman <morgan.haut...@gmail.com > <javascript:;>> > > > wrote: > > > > > > > Hi, > > > > > > > > The problem was that I had no get/setters in my Bean I displayed.. > > > > > > > > Now it renders well on the first page but when I click on the second > > > page I > > > > have: > > > > > > > > Caused by: org.apache.tapestry5.ioc.util.UnknownValueException: Could > > not > > > > find a coercion from type java.lang.String to type java.util.Set. > > > > > > > > I think this is because the url looks like this: > > > > > > > > > > > > > > http://localhost:8090/***/searchstreet.grid.pager/2?t:ac=model.Street$0040141f225/model.Street$0040868971 > > > > . > > > > .. > > > > > > > > And Tapestry thinks "model.Street$0040141f225" is a String but it > > should > > > be > > > > a Bean. > > > > > > > > I tried adding Serializable on my Street bean but it doesn't change > the > > > > error. > > > > > > > > Any idea? > > > > > > > > Regards, > > > > Morgan > > > > > > > > > > > > 2016-04-25 16:05 GMT+02:00 Barry Books <trs...@gmail.com > <javascript:;> > > > <javascript:;>>: > > > > > > > > > Use @pageactvation context and put what's in your onSucess method > in > > > > > setupRender > > > > > > > > > > On Monday, April 25, 2016, Morgan Hautman < > morgan.haut...@gmail.com <javascript:;> > > > > <javascript:;>> > > > > > wrote: > > > > > > > > > > > Hi, > > > > > > > > > > > > Thank you guys. > > > > > > I first tried the fix stated by Felix (@PageActivationContext) > but > > it > > > > > > doesn't work. > > > > > > I then tried the ajax way Nathan provided and I have better > results > > > but > > > > > my > > > > > > grid shows 4 pages/links but I don't see any data. > > > > > > > > > > > > I added > > > > > > > > > > > > <t:zone t:id="zoneGrid" id="zoneGrid"> > > > > > > <div/> > > > > > > <t:grid source="streets" row="street"> > > > > > > *[Grid here]* > > > > > > </t:grid> > > > > > > </t:zone> > > > > > > > > > > > > but still no luck, any one has a pointer? > > > > > > > > > > > > Regards, > > > > > > Morgan > > > > > > > > > > > > 2016-04-25 12:07 GMT+02:00 Nathan Quirynen < > > > > nat...@pensionarchitects.be <javascript:;> <javascript:;> > > > > > > <javascript:;>>: > > > > > > > > > > > > > Hey, > > > > > > > > > > > > > > By returning "this" in the onSuccess event, a redirect happens > > > > > resulting > > > > > > > in a new request. If you want to preserve data between > requests, > > > you > > > > > will > > > > > > > have to save it into the http session. > > > > > > > If you add http session persistence, the data will be available > > > > after a > > > > > > > new request. < > > http://tapestry.apache.org/persistent-page-data.html > > > > > > > > > > > > > > > > > > Simple example for your case: > > > > > > > > > > > > > > @Persist > > > > > > > @Property > > > > > > > private Set<Street> streets;|| > > > > > > > > > > > > > > > > > > > > > Be careful: in this case the whole streets set is saved into > the > > > http > > > > > > > session and will remain there until the end of the session (or > > > until > > > > > you > > > > > > > remove it manually). > > > > > > > You could also persist the form vaues instead and then in > > > setupRender > > > > > > > event fill the trees set based on these values. > > > > > > > Also you can make use of PersistenceConstants.FLASH to let > > Tapestry > > > > > > remove > > > > > > > it from the session after first access automatically. > > > > > > > See more info: > > > > http://tapestry.apache.org/persistent-page-data.html|| > > > > > > > > > > > > > > Another option is making use of AJAX where the updated grid > html > > is > > > > > sent > > > > > > > back in the response and updated on the client side. If you > want > > to > > > > > > achieve > > > > > > > this you'll need to add a Zone around the grid and make your > Form > > > > > submit > > > > > > > with AJAX. > > > > > > > > > > > > > > Your case: > > > > > > > > > > > > > > <t:form t:zone="zoneGrid"> > > > > > > > ... > > > > > > > <t:zone t:id="zoneGrid" id="zoneGrid" > > > > > > > <t:grid source="streets" row="street"> > > > > > > > </t:grid> > > > > > > > </t:zone> > > > > > > > <t:form> > > > > > > > > > > > > > > @Inject > > > > > > > private AjaxResponseRenderer ajax; > > > > > > > @InjectComponent > > > > > > > private Zone zoneGrid; > > > > > > > > > > > > > > void onSuccess() { > > > > > > > ... > > > > > > > ajax.addRender(zoneGrid); > > > > > > > } > > > > > > > > > > > > > > See more info: http://tapestry.apache.org/ajax-and-zones.html > > > > > > > > > > > > > > > > > > > > > Hope this helps u a bit. > > > > > > > Nathan > > > > > > > > > > > > > > > > > > > > > On 25/04/16 11:05, Morgan Hautman wrote: > > > > > > > > > > > > > >> Hi, > > > > > > >> > > > > > > >> I'm trying to make a make grid update when submitting a form > > > within > > > > > the > > > > > > >> same page. > > > > > > >> > > > > > > >> Here is the code: > > > > > > >> > > https://gist.github.com/mhautman/e178fdcca46331e1f4932b1cd7074de7 > > > > > > >> > > > > > > >> The page gets refreshed but the table/source doesn't seem to > be > > > > > updated. > > > > > > >> > > > > > > >> Any help is greatly appreciated. > > > > > > >> > > > > > > >> Regards, > > > > > > >> Morgan > > > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > > > > >