0 Replies Latest reply on Nov 20, 2007 9:46 AM by Vincent Faidherbe

    Problem with DataModel and s:link

    Vincent Faidherbe Newbie

      Hello,

      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?