JSF中selectItems的值未从数据库中分配

时间:2011-11-03 14:13:09

标签: jsf jsf-2 primefaces

我正在尝试从数据库中检索一组值并将其分配给selectItem(Primefaces UI组件)。但它没有分配,而是显示nullPointerException。

我的第一页中有两个视图页面,我只是有一个命令按钮进入一个从DB中检索一些数据的函数,然后我将这些值分配给另一个视图页面中的selectITem(下拉)。

我的第一个视图页面是         

     <html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">

<h:head></h:head>
    <h:body>
     <h:form>
      <p:panel header="autocomplete">
     <h:panelGrid columns="2">


       <p:commandButton value="Submit" action="#{receiveclass.retrieve}" ajax="false">     </p:commandButton>


 </h:panelGrid>

 </p:panel>
  </h:form>

 </h:body>              
    </html> 

动作的java代码是..

         public String retrieve(){


    FacesContext context = FacesContext.getCurrentInstance();
        loginBean loginBean = (loginBean) context.getApplication().evaluateExpressionGet(context, "#{loginBean}", loginBean.class);
List<loginBean> retList=loginDao.retrieval();
        loginBean.setRetList(retList);

        return "success";

                }



}

在上面的代码中,从数据库中检索后,该值被正确设置为retList, Db部分用loginDao编写。

loginBean只是我的下一个视图页面的托管bean,我有selectItem标签,我使用从DB检索到的列表调用该selectItem的setter。

bean部分是..

       List<loginBean> retList;



public List<loginBean> getRetList() {

    return retList;

}
public void setRetList(List<loginBean> retList) {
    this.retList = retList;

在我的下一个视图页面中,我已将selectItems的值指定为

         <h:outputText value="Current City"></h:outputText>
<p:selectOneMenu style="width:150px" id="currentCity" value="#{loginBean.currentCity}" required="true" immediate="true" requiredMessage="Select your city" label="Country">
    <f:selectItem value="#{loginBean.retList}"></f:selectItem>
           </p:selectOneMenu>  

执行后我的控制台说......

                 SEVERE: Error Rendering View[/login.xhtml]
     java.lang.NullPointerException
at                   org.apache.myfaces.shared_impl.renderkit.html.HtmlResponseWriterImpl.write(HtmlResponseWriterImpl.java:867)
at               org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeSelectItems(SelectOneMenuRenderer.java:282)
at                  org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeInput(SelectOneMenuRenderer.java:96)
at           org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeMarkup(SelectOneMenuRenderer.java:75)
at             org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeEnd(SelectOneMenuRenderer.java:53)

我尝试了几种方法,但没有改进。

2 个答案:

答案 0 :(得分:1)

有两个问题。

首先,<f:selectItem>表示单个选择项,但您通过它传递了整个List个项目。您应该使用<f:selectItems>代替。

<f:selectItems value="#{loginBean.retList}" />

其次,PrimeFaces有一个错误,它希望在项目值旁边显式指定选择项目标签。因此,您应指定itemValueitemLabel

<f:selectItems value="#{loginBean.retList}" var="item" itemValue="#{item}" itemLabel="#{item}" />

另见:

答案 1 :(得分:0)

有多个基本问题。

  1. 在jsf-side你需要f:selectItems(复数)而不是f:selectItem(singular)
  2. 类名应该启动
  3. loginbean是否扩展了jsf的selectitem?我不确定。
  4. bean应该使用faces-context.xml配置引用自己,而不是通过elcontext。