4

在我看来,我有一个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>

该组件包含在 a 上<h:panelGroup layout="block">,它会定期用 primefaces 刷新p:poll

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

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

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

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

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)
4

1 回答 1

5

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

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

替换 forEach 组件的以下组件将正确迭代其中的组件生成的 ID,这样页面上将不存在重复的 ID。

注意:只需仔细检查您在页面上使用的是<h:head>代替<head><h:body>代替<body>。在您的堆栈跟踪中,我觉得您可能有其他相关问题。

于 2013-03-08T13:44:16.510 回答