[jboss-user] [JBoss Seam] - Outjection of previous value: selectOneMenu : One 2 Many Rel

kryptontri do-not-reply at jboss.com
Wed Jul 26 15:33:22 EDT 2006


JBoss 4.0.4.GA
JBoss Seam 1.0.1 GA

Hi, I am really stuck and cant progress :-(
I have a page called viewRatePage, which allows
users to add Rate objects to their profile. When
I add a new rate, the selectOneMenu items never
clear on the refresh when a new rate is added,
it contains the old selection of the previous
rate. I do force a null on the injected rate, but
this has no effect. Please please can anyone help?
This issue affects other pages which have the same
relationship, ie adding items to a list.

These are my previous posts:
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=87408

This is my view:


  | <div class="section">
  |                 <fieldset>
  | 
  |                     <div class="entry_small">
  | 
  |                         <c:choose>
  |                             <c:when test='${ratesPageManager.rates == null or ratesPageManager.rowCount == 0}'>
  |                                 Empty Rates
  |                             </c:when>
  |                             <c:otherwise>
  |                                  <h:dataTable value="#{ratesPageManager.rates}" var="item"  rendered="#{ratesPageManager.rowCount>0}" rowClasses="rvgRowOne,rvgRowTwo">
  | 
  |                                      <h:column>
  |                                       <f:facet name="header"><h:outputText value="Duration"/></f:facet>
  |                                       <h:outputText value="#{item.duration}"/>
  |                                     </h:column>
  |                                     <h:column>
  |                                       <f:facet name="header"><h:outputText value="Unit"/></f:facet>
  |                                       <h:outputText value="#{item.unit}"/>
  |                                     </h:column>
  |                                     <h:column>
  |                                       <f:facet name="header"><h:outputText value="Currency"/></f:facet>
  |                                       <h:outputText value="#{item.currency}"/>
  |                                     </h:column>
  |                                     <h:column>
  |                                       <f:facet name="header"><h:outputText value="Cost"/></f:facet>
  |                                       <h:outputText value="#{item.cost}"/>
  |                                     </h:column>
  |                                     <h:column>
  |                                         <f:facet name="header">Action</f:facet>
  |                                         <h:commandLink action="#{ratesPageManager.deleteRate}">Delete</h:commandLink>
  |                                     </h:column>
  | 
  |                                  </h:dataTable>
  |                             </c:otherwise>
  |                         </c:choose>
  | 
  |                     </div>
  |                 </fieldset>
  | 
  |                 <br/>
  |                 <fieldset>
  |                 <div class="entry_small">
  |                         <h:form>
  |                         <table>
  |                             <tr>
  |                                 <td><div class="label"><h:outputLabel>Duration:</h:outputLabel></div></td>
  |                                 <td><div class="select"><h:selectOneMenu value="#{rate.duration}"><f:selectItems value="#{ratesManager.durations}"/></h:selectOneMenu></div></td>
  |                                 <td><div class="label"><h:outputLabel>Unit:</h:outputLabel></div></td>
  |                                 <td><div class="select"><h:selectOneMenu value="#{rate.unit}"><f:selectItems value="#{ratesManager.units}"/></h:selectOneMenu></div></td>
  |                                 <td><div class="label"><h:outputLabel>Currency:</h:outputLabel></div></td>
  |                                 <td><div class="select"><h:selectOneMenu value="#{rate.currency}"><f:selectItems value="#{ratesManager.currencys}"/></h:selectOneMenu></div></td>
  |                                 <td><div class="label"><h:outputLabel>Cost:</h:outputLabel></div></td>
  |                                 <td><div class="select"><h:selectOneMenu value="#{rate.cost}"><f:selectItems value="#{ratesManager.costs}"/></h:selectOneMenu></div></td>
  |                             </tr>
  |                             <tr>
  |                                 <td colspan="8">
  |                                     <h:commandButton value="Add Rate" action="#{ratesPageManager.addRate}" class="button"/> 
  |                                 </td>
  |                             </tr>
  |                         </table>
  |                         </h:form>
  |                   </div>
  |                 </fieldset>
  |             </div>
  | 

Any my Rate object that gets instantiated is an entity bean:


  | @Entity
  | @Name("rate")
  | @Scope(EVENT)
  | public class Rate implements Serializable {
  | 
  |     protected int Id = 0;
  | 
  |     protected int duration = 0;
  |     protected String unit = null;
  |     protected String currency = null;
  |     protected int cost = 0;
  |     protected RatesPage ratesPage = null;
  | 
  |     @Id
  |     @GeneratedValue(strategy = GenerationType.AUTO)
  |     public int getId() {
  |         return Id;
  |     }
  | 
  |     public void setId(int id) {
  |         Id = id;
  |     }
  |     ... // for brevity
  | 

My session bean behind the page is (with unnecessary methods removed):


  | @Stateful
  | @Scope(ScopeType.SESSION)
  | @Name("ratesPageManager")
  | @Interceptors(SeamInterceptor.class)
  | @LoggedIn
  | @TransactionAttribute(REQUIRES_NEW)
  | public class RatesPageManagerBean implements RatesPageManager {
  | 
  |     @In
  |     @Out
  |     @Valid
  |     private User user;
  | 
  |     @In
  |     @Out
  |     @Valid
  |     private Profile profile;
  | 
  |     @In(required = false)
  |     @Out(required = false)
  |     @Valid
  |     private RatesPage ratesPage;
  | 
  |     @PersistenceContext
  |     private EntityManager em;
  | 
  |     @In
  |     private transient FacesContext facesContext;
  | 
  |     @DataModel
  |     private List<Rate> rates = new ArrayList();
  | 
  | 
  |     @DataModelSelection
  |     private Rate selectedRate;
  | 
  |     @In(required = false)
  |     private Rate rate;
  | 
  | 
  |     //public Rate getRate() {
  |     //    return newRate;
  |     //}
  | 
  |    // public void setRate(Rate rate) {
  |    //     this.newRate = rate;
  |    // }
  | 
  | 
  | 
  |     @IfInvalid(outcome = REDISPLAY)
  |     public String create() {
  |         if (profile.getRatesPage() == null) {
  |             em.persist(ratesPage);
  |             profile.setRatesPage(ratesPage);
  |             profile = em.merge(profile);
  |             ratesPage = em.merge(ratesPage);
  |             em.refresh(user);
  |             return "viewRatesPage";
  |         } else {
  |             facesContext.addMessage(null, new FacesMessage("RatesPage already exists"));
  |             return "viewProfile";
  |         }
  |     }
  | 
  |     public String select() {
  |         profile = user.getProfile();
  |         ratesPage = profile.getRatesPage();
  |         rates.clear();
  |         rates.addAll(ratesPage.getRates());
  |         clearRatesOnDisplay();
  |         return "viewRatesPage";
  |     }
  | 
  |     private boolean isUnSet(Rate rateToCheck) {
  | 
  |         boolean isOk =  (
  |                         (rateToCheck.getCost() == 0) || (rateToCheck.getCurrency().equals("-")) ||
  |                         (rateToCheck.getDuration() == 0) || (rateToCheck.getUnit().equals("-"))
  |                         );
  |         log.info("Rate check:: cost=" + rateToCheck.getCost() + " currency=" +rateToCheck.getCurrency()
  |                  + " duration=" + rateToCheck.getDuration() + " unit=" + rateToCheck.getUnit());
  |         return isOk;
  |     }
  | 
  | 
  |     public String addRate() {
  |         log.info("addRate() called - " + rate);
  | 
  |         if(isUnSet(rate)) {
  |             log.warn("Failed rates check");
  |              rate = null;
  |             facesContext.addMessage(null, new FacesMessage("Please enter rates"));
  |             return "viewRatesPage";
  |         }
  |         log.info("trying to add rate - " + rate);
  |         rate.setRatesPage(ratesPage);
  |         em.persist(rate);
  |         ratesPage.addRate(rate);
  |         ratesPage = em.merge(ratesPage);
  |         profile = em.merge(profile);
  |         log.info("Persisted! and trying to remove");
  |         clearRatesOnDisplay();
  |         return select();
  |     }
  | 
  |     public String deleteRate() {
  |         log.info("deleteRate() called, removing " + selectedRate);
  |         rates.remove(selectedRate);
  |         ratesPage.removeRate(selectedRate);
  |         em.remove(selectedRate);
  |         clearRatesOnDisplay();
  |         return "viewRatesPage";
  |     }
  | 
  |     public String delete() {
  |         profile.setRatesPage(null);
  |         em.remove(ratesPage);
  |         profile = em.merge(profile);
  |         ratesPage = null;
  |         return "viewProfile";
  |     }
  | 
  |     private void clearRatesOnDisplay() {
  |         Contexts.getPageContext().remove("rate");
  |         //Contexts.getPageContext().remove("ratesManager");
  |         rate = null;
  |         selectedRate = null;
  |     }
  | }
  | 

The component/javabean that provides the rate types and values is

  | @Name("ratesManager")
  | @Interceptors(SeamInterceptor.class)
  | @Scope(ScopeType.APPLICATION)
  | public class Rates {
  | 
  |     public Rates() {
  |         log.info("** Rates (RatesManager) instantated **");
  |     }
  | 
  |     /**
  |      * The durations
  |      */
  |     static final String[][] DURATION = // left out for brevity
  | 
  |     /**
  |      * The units
  |      */
  |     static final String[][] UNIT = // left out for brevity
  | 
  |     /**
  |      * The currency
  |      */
  |     static final String[][] CURRENCY = // left out for brevity
  | 
  |     /**
  |      * The cost
  |      */
  |     static final String[][] COST = // left out for brevity
  | 
  |     /**
  |      * The duration list
  |      *
  |      * @return List
  |      */
  |     public List<SelectItem> getDurations() {
  |         List<SelectItem> result = new ArrayList<SelectItem>();
  |         for (int i = 0; i < DURATION.length; i++) {  // value, label, desc
  |             result.add(new SelectItem(DURATION[0], DURATION[1], DURATION[2]));
  |         }
  |         return result;
  |     }
  | 
  |     /**
  |      * The unit list
  |      *
  |      * @return List
  |      */
  |     public List<SelectItem> getUnits() {
  |         List<SelectItem> result = new ArrayList<SelectItem>();
  |         for (int i = 0; i < UNIT.length; i++) {  // value, label, desc
  |             result.add(new SelectItem(UNIT[0], UNIT[1], UNIT[2]));
  |         }
  |         return result;
  |     }
  | 
  |     /**
  |      * The currency list
  |      *
  |      * @return List
  |      */
  |     public List<SelectItem> getCurrencys() {
  |         List<SelectItem> result = new ArrayList<SelectItem>();
  |         for (int i = 0; i < CURRENCY.length; i++) {  // value, label, desc
  |             result.add(new SelectItem(CURRENCY[0], CURRENCY[1], CURRENCY[2]));
  |         }
  |         return result;
  |     }
  | 
  |     /**
  |      * The cost list
  |      *
  |      * @return List
  |      */
  |     public List<SelectItem> getCosts() {
  |         List<SelectItem> result = new ArrayList<SelectItem>();
  |         for (int i = 0; i < COST.length; i++) {  // value, label, desc
  |             result.add(new SelectItem(COST[0], COST[1], COST[2]));
  |         }
  |         return result;
  |     }
  | 
  | 
  | }
  | 

Upon inserting the first rate, the view still shows the previous rate in the selectMenus, if you
change it and reinsert, the following exception is thrown


  | 20:32:37,698 ERROR [STDERR] Jul 26, 2006 8:32:37 PM com.sun.facelets.FaceletViewHandler handleRenderException
  | SEVERE: Error Rendering View
  | java.lang.IllegalStateException: Client-id : _id0 is duplicated in the faces tree.
  |         at org.apache.myfaces.application.jsp.JspStateManagerImpl.checkForDuplicateIds(JspStateManagerImpl.java:241)
  |         at org.apache.myfaces.application.jsp.JspStateManagerImpl.checkForDuplicateIds(JspStateManagerImpl.java:255)
  |         at org.apache.myfaces.application.jsp.JspStateManagerImpl.saveSerializedView(JspStateManagerImpl.java:204)
  |         at org.jboss.seam.jsf.SeamStateManager.saveSerializedView(SeamStateManager.java:46)
  |         at com.sun.facelets.FaceletViewHandler.writeState(FaceletViewHandler.java:589)
  |         at org.apache.myfaces.renderkit.html.HtmlFormRendererBase.encodeBegin(HtmlFormRendererBase.java:74)
  |         at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:307)
  |         at com.sun.facelets.FaceletViewHandler.encodeRecursive(FaceletViewHandler.java:511)
  |         at com.sun.facelets.FaceletViewHandler.encodeRecursive(FaceletViewHandler.java:518)
  |         at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:447)
  |         at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:352)
  |         at javax.faces.webapp.FacesServlet.service(FacesServlet.java:107)
  |         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
  |         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
  |         at org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:92)
  |         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
  |         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
  |         at org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:122)
  |         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
  |         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
  |         at org.jboss.seam.servlet.SeamRedirectFilter.doFilter(SeamRedirectFilter.java:30)
  |         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
  |         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
  |         at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
  |         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
  |         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
  |         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
  |         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
  |         at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
  |         at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
  |         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
  |         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
  |         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
  |         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
  |         at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
  |         at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
  |         at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
  |         at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
  |         at java.lang.Thread.run(Thread.java:595)
  | 20:32:37,700 ERROR [STDERR] Jul 26, 2006 8:32:37 PM com.sun.facelets.FaceletViewHandler handleRenderException
  | SEVERE: Took Type: java.io.PrintWriter
  | 20:32:37,717 INFO  [RatesPageManagerBean] getRates() called size = 1
  | 

The server debug log shows that the previous rate object is passed down.

I tried modifiying the messages example with no success as the input field in the view
still had the old inserted value, see previous thread i mentioned.

Any ideas people ... i tried formatting this properly to get some help about this :-(

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3961114#3961114

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3961114



More information about the jboss-user mailing list