2011-05-04 56 views
1

我開發一個JSF,RichFaces的application.where我想填充從。我已經實現了這個像第一個選擇的選擇的基礎上,第二選擇菜單的值: 第一個菜單:JSF H:selectOneMenu用於問題

第二菜單:

<h:outputText id="section1" value="Section" /> 
    <h:selectOneMenu id="section2" value="#{content.sectionname}" > 
     <f:selectItems value="#{content.sections}" /> 
    </h:selectOneMenu> 

究竟我要的是:我有兩個表一個類別和一個部分。如果用戶從下拉菜單中選擇一個類別,那麼該部分的其他下拉菜單應該只包含所選類別的值。使用這個我得到了期望的結果,但是在提交表單時我收到以下錯誤:

例外

javax.servlet.ServletException 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:256) 
    org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) 
    org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) 
    org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) 
    org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) 
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 

root cause 

java.util.NoSuchElementException 
    javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:117) 
    javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:144) 
    javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:49) 
    javax.faces.component.UISelectOne.matchValue(UISelectOne.java:164) 
    javax.faces.component.UISelectOne.validateValue(UISelectOne.java:137) 
    javax.faces.component.UIInput.validate(UIInput.java:867) 
    javax.faces.component.UIInput.executeValidate(UIInput.java:1065) 
    javax.faces.component.UIInput.processValidators(UIInput.java:666) 
    javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1033) 
    javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1033) 
    javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1033) 
    org.richfaces.component.UISwitchablePanel.processValidators(UISwitchablePanel.java:218) 
    javax.faces.component.UIForm.processValidators(UIForm.java:229) 
    org.ajax4jsf.component.AjaxViewRoot$3.invokeContextCallback(AjaxViewRoot.java:442) 
    org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:235) 
    org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:458) 
    com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:100) 
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251) 
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) 
    org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) 
    org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) 
    org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) 
    org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) 
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 

誰能告訴我這是什麼異常的原因以及如何解決這個問題。 請幫忙。

+1

可以請你打開了'content' bean的代碼 – 2011-05-04 07:27:27

回答

2

你會得到這個異常落後時<f:selectItems>收藏價值不存在了此刻的形式提交的被處理。您的託管bean顯然已放置在請求範圍內。任何bean屬性在請求結束時都會丟失,並且需要在下一個請求中以相同方式預填充。

在JSF 1.x中,你需要確保同樣的集合bean的構造函數或postconstruct編制。另一種方法是將bean放入會話範圍。但由於堆棧跟蹤提示您使用的是Ajax4jsf,因此您也可以使用<a4j:keepAlive>

<a4j:keepAlive beanName="#{content}" /> 

在JSF 2.x中,只需將bean放入視圖範圍即可。

+0

感謝。我所做的是,我已將bean保留在會話範圍內。這解決了我的問題。 – user12345 2011-05-05 10:30:12

+0

@BalusC你好,keepAlive會消耗很多內存嗎? – 2011-10-02 11:05:07