1

First, let me explain the structure. I have some JSF Facelets pages, which use a template to provide a common header with dynamically generated menus. Within that template, the menus are generated with the following code:

<ui:repeat var="item" value="#{mainMenuBackingBean.subMenuItemsList}">
                        <td class="#{item.cssClass}">
                            <h:outputLink id="submenu_#{item.nameText}" value="#{item.linkPath}" disabled="#{item.disabled}">
                                #{item.nameText}
                            </h:outputLink>
                        </td>
                    </ui:repeat>

Each individual page has a page backing bean which knows how to set up its menus, and so before the page is rendered the menus are set up with the following code:

<f:event listener="#{specificPageBackingBeanHere.setup}" type="preRenderView"></f:event>

Which calls the setup method in the abstract class that all specific page backing beans extend, which then makes some calls to add the right elements to the mainMenueBackingBean's menu lists. So far this has worked out perfectly for us, and we've had no issues, until now.

On a new page, we have a table with a dynamic layout as implemented with the following piece of code:

<table class="gridall">
        <tr>
            <td colspan="4" style="text-align: center;"><b>Table Title</td>
        </tr>
        <tr>
            ...
            column headings here
            ...
        </tr>
        <ui:repeat var="item" value="#{outgoingFaxBacking.outgoingList}">
            <tr bgcolor="#{item.status.color}">
                <td style="text-align: center;" class="itemsTopCell">
                    <h:commandLink value="#{item.itemNo}" action="#{outgoingFaxBacking.testMe}" > 
                        <f:ajax render=":rightColumn"/>
                    </h:commandLink>
                    <br/>
                    <b>Last: #{item.lastString}</b>
                </td>
                <td class="itemsTopCell">
                    #{item.description}
                </td>
                <td style="text-align: center" class="itemsTopCell">
                    <h:outputText value="#{item.quantity}">
                        <f:convertNumber maxFractionDigits="2"/>
                    </h:outputText>
                </td>
                <td style="text-align: center;" class="itemsTopCell">
                    <h:inputHidden id="notFilledNote" value="#{outgoingFaxBacking.notFilledNote}"/>
                    <h:commandButton  action="#{outgoingFaxBacking.markNotFilled(item.id)}" onclick="return(notFilled());" value="Not Filled">
                        <f:ajax execute="notFilledNote" render="@form"/>
                    </h:commandButton>
                </td>
            </tr>
            <tr bgcolor="#{item.status.color}">
                <h:panelGroup rendered="#{empty item.note}">
                    <td style="border-top: 1px;" colspan="4">
                        #{item.sig}
                    </td>
                </h:panelGroup>
                <h:panelGroup rendered="#{not empty item.note}">
                    <td style="border-top: 1px; border-bottom:0px;" colspan="4">
                        #{item.sig}
                    </td>
                </h:panelGroup>     
            </tr>
            <h:panelGroup rendered="#{not empty item.note}">
                <tr bgcolor="#{item.status.color}">
                    <td colspan="4" style="border-top: 1px;">
                        #{item.note}
                    </td>
                </tr>
            </h:panelGroup>
            <tr>
                <td style="border: 0px;font-size:2%" colspan="3">
                 &nbsp;
                </td>
            </tr>
        </ui:repeat>
    </table>

The page renders perfectly the first time through. The problem is that when you click on either the commandLink or the commandButton in the table (and only this table, no other command element on the page causes this), an error is generated which reads as so:

serverError: class javax.faces.view.facelets.TagAttributeException /WEB-INF/templates/secure.xhtml @130,106 id="submenu_#{item.nameText}": Property 'nameText' not found on type org.ppa.db.serializabledb.FaxItemsContainer

The error location (@130,106) is the menu code I quoted above, but the type of object (FaxItemsContainer) being looked at is used in the dynamic table above, not the menus. After fiddling with this for a bit, and making sure it wasn't an ajax problem, or a ui:include problem, or anything else, we finally changed the var name in the table from "item" to "faxItem" and it appears to work.

So ultimately, my question is I thought that the var name for ui:repeat (and other JSF components) was local in scope, and therefore it shouldn't matter that two ui:repeats on the same page use the same var name; is this not the case? Do ui:repeat tags on the same page really require unique var names?

I'm running Mojarra 2.1.3 on Tomcat 7.

moneyt
  • 452
  • 8
  • 18
  • I'm facing a similar problem, it seems that the problem happens during the render view of a post request, not the first time the view is rendered. – landal79 Jun 06 '13 at 13:30
  • I have had a similar problem in 2 seperate projects, I realised what is causing the problem for me (I believe at this stage) was when I implemented my proposed 'solution' to another problem listed here: https://stackoverflow.com/a/44123851/685032 regarding clearing out form values. I havent gotten to the bottom of what the real underlying issue is yet (and I may never get time to), but hopefully this may help someone if they face the same series of issues. – hendinas May 23 '17 at 05:51

0 Answers0