java.lang.IllegalStateException:在视图中已找到组件ID。发生在selectOneMenu上

时间:2013-03-08 11:37:08

标签: jsf

在我看来,我有一个selectOneMenu,如下面的代码所示:

   <h:panelGroup id="mysrvicenodesblock" layout="block">
     <table id="mysrvicenodestab" border="0" width="100%">
    <tr>
          <td align="center" class="underline">node Id</td>
          <td align="center" class="underline">node Name</td>
          <td align="center" class="underline">Go to node</td>                                  
          <td align="center" class="underline">Action</td>
        </tr>
      <c:forEach items="${jbpmAPIUtil.myServiceNodeToComplete}" var="msntoc">
        <tr>
          <td align="center">${msntoc.getId()}</td>
          <td align="center">${msntoc.getName()}</td>
          <td align="center">
         <h:selectOneMenu value="#{jbpmAPIUtil.procNdNameSelectedValue}" id="procnodes">
                <f:selectItem itemLabel="" itemValue="" />
                <f:selectItems value="#{jbpmAPIUtil.procnodes}" var="pn"  itemLabel="# {pn.getName()}" itemValue="#{pn.getId()}" />
<f:ajax event="change" listener="#{jbpmAPIUtil.OnONeMenuProcNdSelChgeHndler}" />
             </h:selectOneMenu>
          </td>                                     
          <td align="center">                                               
          <h:commandLink value="Complete !">
             <f:ajax event="click" listener="#{jbpmAPIUtil.Completemsn}">
             </f:ajax>                                             <f:param value="${msntoc.getWorkitemid()}" name="msntocwiid"/>
                                                 </h:commandLink>
 </td>             


     </tr>
</c:forEach>
</table>
</h:panelGroup>

此组件包含在<h:panelGroup layout="block">上,该p:poll会定期刷新,使用主要面SEVERE: +id: j_id1 type: javax.faces.component.UIViewRoot@c0fee0 +id: javax_faces_location_HEAD type: com.sun.faces.component.ComponentResourceContainer@5be0a8 +id: j_id2 type: javax.faces.component.UIOutput@1fa3bee +id: j_id3 type: javax.faces.component.UIOutput@174b989 +id: j_id4 type: javax.faces.component.UIOutput@40f2f1 +id: j_idt2 type: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html> +id: j_idt3 type: <html xmlns="http://www.w3.org/1999/xhtml"> +id: j_idt4 type: javax.faces.component.UIOutput@dd874 +id: j_idt5 type: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link rel="stylesheet" type="text/css" href="CSS/general.css"/> <script src="JS/jquery-1.8.3.js"/> <script src="JS/jquery-ui-1.10.0.custom.js"/> <script src="JS/jquerygen.js"/> <script src="JS/general.js"/> <title>Xtensus Workflow App </title> +id: j_idt6 type: <body> +id: j_idt7 type: javax.faces.component.html.HtmlForm@fdc98d +id: j_idt8 type: <div id="ctrldiv"> Id du noeud actuel (le curseur jbpm) : +id: niid type: javax.faces.component.html.HtmlOutputText@1bb55d3 +id: j_idt9 type: <br/> Nom du noeud actuel (le curseur jbpm) : +id: cnn type: javax.faces.component.html.HtmlOutputText@1ff95a9 +id: j_idt10 type: <br/> +id: j_idt11 type: javax.faces.component.html.HtmlCommandLink@baa6f7 +id: j_idt12 type: <br/> <br/> <H3>#Noeuds en cours d'execution : </H3> <div> +id: mysrvicenodesblock type: javax.faces.component.html.HtmlPanelGroup@27d9e5 +id: j_idt13 type: <table id="mysrvicenodestab" border="0" width="100%"> <tr> <td align="center" class="underline">node Id</td> <td align="center" class="underline">node Name</td> <td align="center" class="underline">Go to node</td> <td align="center" class="underline">Action</td> </tr> +id: j_idt18 type: <tr> <td align="center">${msntoc.getId()}</td> <td align="center">${msntoc.getName()}</td> <td align="center"> +id: procnodes type: javax.faces.component.html.HtmlSelectOneMenu@527386 +id: j_idt19 type: javax.faces.component.UISelectItem@11e7e46 +id: j_idt20 type: javax.faces.component.UISelectItems@f45673 +id: j_idt21 type: </td> <td align="center"> +id: j_idt22 type: javax.faces.component.html.HtmlCommandLink@157be76 +id: j_idt23 type: javax.faces.component.UIParameter@1996e15 +id: j_idt24 type: </td> </tr> +id: j_idt25 type: <tr> <td align="center">${msntoc.getId()}</td> <td align="center">${msntoc.getName()}</td> <td align="center"> +id: procnodes type: javax.faces.component.html.HtmlSelectOneMenu@a5adc +id: j_idt27 type: javax.faces.component.UISelectItem@1d34eac +id: j_idt28 type: javax.faces.component.UISelectItems@1d20651 +id: j_idt29 type: </td> <td align="center"> +id: j_idt30 type: javax.faces.component.html.HtmlCommandLink@19cee52 +id: j_idt31 type: javax.faces.component.UIParameter@1e27046 +id: j_idt32 type: </td> </tr> +id: j_idt33 type: <tr> <td align="center">${msntoc.getId()}</td> <td align="center">${msntoc.getName()}</td> <td align="center"> +id: procnodes type: javax.faces.component.html.HtmlSelectOneMenu@1391a2c +id: j_idt35 type: javax.faces.component.UISelectItem@1e54eb7 +id: j_idt36 type: javax.faces.component.UISelectItems@1930089 +id: j_idt37 type: </td> <td align="center"> +id: j_idt38 type: javax.faces.component.html.HtmlCommandLink@860ba +id: j_idt39 type: javax.faces.component.UIParameter@664ca +id: j_idt40 type: </td> </tr> +id: j_idt14 type: </table> +id: j_idt15 type: </div> </div> +id: j_idt16 type: org.primefaces.component.poll.Poll@1c334de +id: j_idt17 type: </body> </html> Mar 8, 2013 5:08:49 AM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException SEVERE: Error Rendering View[/index.xhtml] java.lang.IllegalStateException: Component ID j_idt7:procnodes has already been found in the view. at com.sun.faces.util.Util.checkIdUniqueness(Util.java:910) at com.sun.faces.util.Util.checkIdUniqueness(Util.java:894) at com.sun.faces.util.Util.checkIdUniqueness(Util.java:894) at com.sun.faces.application.view.FaceletFullStateManagementStrategy.saveView(FaceletFullStateManagementStrategy.java:680) at com.sun.faces.application.StateManagerImpl.saveView(StateManagerImpl.java:89) at javax.faces.application.StateManager.getViewState(StateManager.java:553) at com.sun.faces.context.PartialViewContextImpl.renderState(PartialViewContextImpl.java:416) at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:300) at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183) at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:981) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:409) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1770) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

用于绑定此元素值的bean是会话范围的bean(我不知道这是否也称为“绑定”,此组件上没有“绑定”属性)。

我在很多帖子中都看到这个问题发生了,因为bean和视图有不同的范围,但我记得我已经多次出现这种情况而没有出现这个问题。

我希望确切知道哪个绑定导致了这个问题,还有其他解决方案可以避免这个问题发生。

这是此问题的完整堆栈,当我单击commandLink按钮时会发生这种情况,因此带有foreach循环内容的表将更改(一行将被删除,另外两行将添加到列表中)

{{1}}

1 个答案:

答案 0 :(得分:5)

<c:forEach> JSTL默认情况下不会增加其中组件的子ID。您可能需要使用EL表达式执行此操作,或者使用更适合迭代集合的JSF组件,例如UIRepeat

<ui:repeat value="#{jbpmAPIUtil.myServiceNodeToComplete}" var="msntoc">

替换forEach组件的以下组件将正确迭代由此内部组件生成的ID,这样就不会在页面上存在重复ID。

注意:只需仔细检查您是否在页面上使用<h:head>而不是<head><h:body>而不是<body>。在您的堆栈跟踪中,您可能会遇到与此相关的其他问题,这看起来很可疑。