Problem with DataModel and s:link
vfaid Nov 20, 2007 9:46 AMHello,
I'm using Seam 2.0GA.
I've a rich:dataTable that displays the values of a DataModel outjected from a "search" component. Each row defines a s:link with an action that triggers the call to a select method of an "info" component throuh a pageflow. The two components are in a the same conversation scope.
It works fine if I use h:commandLink or h:commandButton but if i use s:link, it fails. The value passed to the select method is always the one that's attached to first row I've clicked.
Here are the code snippets.
SearchBookingAction:
@Stateful @Scope(ScopeType.CONVERSATION) @Name("search") @Restrict("#{identity.loggedIn}") public class SearchBookingAction implements SearchBooking { @In private EntityManager arsEntityManager; @DataModel private List<Booking> bookings; private String pnr; private String flightNumber; private Date flightDate; public void search() { Query query = arsEntityManager.createQuery(...); bookings = query.getResultList(); } .... }
BookingInfoAction:
@Stateful @Scope(ScopeType.CONVERSATION) @Name("info") public class BookingInfoAction implements BookingInfo { @In private EntityManager arsEntityManager; private Booking booking; private List<Flight> departureFlights; private List<Flight> returnFlights; public void selectBooking(Booking booking) { this.booking = booking; } public boolean populate() { log.info("info.populate() called with: "+booking.getPnr()); if (booking == null) return false; departureFlights = selectDepartureFlights(); returnFlights = selectDepartureFlights(); return true; } ... }
search.xhtml:
<rich:dataTable value="#{bookings}" var="currentBooking" > <rich:column> <f:facet name="header">#{messages['asr.list.pnr']}</f:facet> #{currentBooking.pnr} </rich:column> <rich:column> <f:facet name="header">#{messages['asr.list.name']}</f:facet> #{currentBooking.masterName} </rich:column> <rich:column> <f:facet name="header">#{messages['asr.list.flightnum']}</f:facet> #{currentBooking.masterFlightNumber} </rich:column> ... <rich:column> <f:facet name="header">#{messages['asr.list.viewheader']} :</f:facet> <s:link value="#{messages['asr.list.view']}" action="view" /> </rich:column> </rich:dataTable>
bo.jpdl.xml:
<start-page name="displaySearchBookingForm" view-id="/search.xhtml"> <redirect/> ... <transition name="view" to="populateBookingInfo"> <action expression="#{info.selectBooking(currentBooking)}" /> </transition> </start-page> <decision name="populateBookingInfo" expression="#{info.populate()}"> <transition name="true" to="displayBooking"/> <transition name="false" to="displayFindBookingForm"/> </decision> <page name="displayBooking" view-id="/booking.xhtml" back="enabled"> <redirect/> ... </page> ...
Any ideas why it works with a h:commandButton or h:commandLink and not a s:link?