jsf h:selectonemenu问题

时间:2011-05-04 07:23:32

标签: java jsf

我正在开发一个jsf,richfaces应用程序。我希望在选择第一个选项的基础上填充第二个选择菜单的值。我已经实现了这样: 第一个菜单:

                                   第二个菜单:

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

我想要的是:我有两个表用于类别,一个表用于部分。如果用户从下拉菜单中选择一个类别,则该部分的另一个下拉菜单应该只包含所选类别的值。为此,我得到了所需的结果,但在提交表单时,我收到以下错误:< / p>

例外

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 个答案:

答案 0 :(得分:2)

当处理表单提交时,当<f:selectItems>值后面的集合不再存在时,您将收到此异常。您的托管bean显然已放在请求范围内。任何bean属性都会在请求结束时丢失,并且需要在下一个请求中以相同的方式预先填充。

在JSF 1.x中,您需要确保在bean的构造函数或postconstruct中准备了相同的集合。另一种方法是将bean放在会话范围内。但是由于stacktrace暗示你正在使用Ajax4jsf,你也可以使用<a4j:keepAlive>

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

在JSF 2.x中,它更容易,只需将bean放在视图范围内即可。