2010-07-23 45 views
1

虽然有很多关于该主题的教程,但我一直在努力解决这个问题。我正在测试JSF 2.0中h:dataTable组件的功能。我有以下列表:h:dataTable问题 - 目标模型类型不是集合或数组

 <h:dataTable border="1" styleClass="data zebra" value="#{testTableWB.testList}" var="items"> 
      <h:column> 
       <f:facet name="header"> 
       <h:outputText value="id"/> 
       </f:facet> 
       <h:outputText value="#{items.id}"/> 
      </h:column> 

      <h:column> 
       <f:facet name="header"> 
      <h:outputText value="name"/> 
       </f:facet> 
      <h:outputText value="#{items.name}"/> 
      </h:column> 
      <h:column> 
       <f:facet name="header"> 
       <h:outputText value="description"/> 
       </f:facet> 
       <h:outputText value="#{items.description}"/> 
      </h:column> 
      <h:column> 
       <f:facet name="header"> 
       </f:facet> 
       <h:selectManyCheckbox id="ids" value="#{items.id}"> 
        <f:selectItem value="#{ids}" itemLabel="" /> 
       </h:selectManyCheckbox> 
      </h:column> 
      <h:column> 
       <f:facet name="header"> 
       </f:facet> 
       <h:commandLink action="testTableWB.someStupidAction" value="Edit"> 
        <f:param id="itemIDEdit" value="items.id"/> 
       </h:commandLink> 
      </h:column> 
      <h:column> 
       <f:facet name="header"> 
       </f:facet> 
       <h:commandLink action="testTableWB.someStupidAction" value="Show"> 
        <f:param id="itemIDShow" value="items.id"/> 
       </h:commandLink> 
      </h:column>    
     </h:dataTable> 

我的Managed Bean的是这样的:

@ManagedBean(name = “testTableWB”) @RequestScoped 公共类TestTableWBR扩展VerificationWBR {

private List<TestElement> testList; 

public List<TestElement> getTestList() { 
    testList = new ArrayList<TestElement>(); 

    for (int i=0; i<5;i++){ 
     testList.add(new TestElement(new Long(i),"name"+i, "descrition"+i)); 
    } 

    testList.add(new TestElement(10L,"mark", "test element")); 

    return this.testList; 
} 

public void setTestList(List<TestElement> pTestList) { 
    this.testList = pTestList; 
} 

public void someStupidAction(){ 
    String parameter = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("itemIDEdit"); 

} 

所以,当我点击其中一个命令链接 - 编辑或显示时,我期待着被调用的动作,并且我在那里有一个断点。相反,我得到一个错误:目标模型类型没有一个集合或数组和以下堆栈跟踪:

javax.faces.FacesException: Target model Type is no a Collection or Array 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel(MenuRenderer.java:390) 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValue(MenuRenderer.java:127) 
    at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:313) 
    at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1008) 
    at javax.faces.component.UIInput.validate(UIInput.java:934) 
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1189) 
    at javax.faces.component.UIInput.processValidators(UIInput.java:691) 
    at javax.faces.component.UIData.iterate(UIData.java:1424) 
    at javax.faces.component.UIData.processValidators(UIData.java:1015) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIForm.processValidators(UIForm.java:243) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080) 
    at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1179) 
    at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:310) 
    at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:333) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at com.bmw.verdict.web.fupload.UploadFilter.doFilter(UploadFilter.java:70) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:313) 
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1093) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1093) 
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:291) 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:666) 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:597) 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:872) 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) 
    at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:382) 
    at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:264) 
    at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) 

根据文档的dataTable组件应与列表数据类型。我根本没有得到托管bean,所以我猜想在生命周期之前出现了一些问题。那么我在哪里错了?我在这里先向您的帮助表示感谢。

Regards,al

+1

只需验证呈现的页面的视图源并检查它正在生成的数据。我相信你能够找到你错过的东西 – GustyWind 2010-07-23 09:24:20

+0

在视图代码中找不到什么奇怪的东西。但是我能够发现的是,当我用复选框删除列时,它完美地工作。麻烦的是我需要这些复选框。我将它们定义如下: < F:选择信息值= “#{} IDS” itemLabel = “”/> 你看到什么不对呢? – 2010-07-23 10:41:32

回答

1

好的,解决了。改用secletBooleanCheckBox。

+1

事实上,这个例外基本上告诉你,h:selectManyCheckbox的'value'不是'List '或'T []',而它是期望值类型。但你实际上并不是在这之后,只是一个'boolean'属性。 – BalusC 2010-07-23 21:24:40