Jsf <;c:forEach>;将第一项或最后一项随机加倍–;这是已知的bug吗?

Jsf <;c:forEach>;将第一项或最后一项随机加倍–;这是已知的bug吗?,jsf,jstl,richfaces,Jsf,Jstl,Richfaces,我现在已经花了大约3个小时用下面的代码片段调试了一个奇怪的行为。我使用带有的动态在运行时包含一组不断变化的元素 这在9/10的情况下非常有效但有时第一列或最后一列会加倍。请查看以下精简示例: <f:subview id="sv-#{delegate.uuid}"> <rich:dataTable value="#{TabellenDelegateHelper.findRowsTabelle(delegate)}" var="row" rows="#{TabellenD

我现在已经花了大约3个小时用下面的代码片段调试了一个奇怪的行为。我使用带有
的动态
在运行时包含一组不断变化的
元素

这在9/10的情况下非常有效但有时第一列或最后一列会加倍。请查看以下精简示例:

<f:subview id="sv-#{delegate.uuid}">

    <rich:dataTable value="#{TabellenDelegateHelper.findRowsTabelle(delegate)}" var="row" rows="#{TabellenDelegateHelper.map(delegate).rows}">
        <rich:column>
            <f:facet name="header">
                <h:outputText value="Fixed Column" />
            </f:facet>
        </rich:column>

        <c:forEach var="theColumn" items="#{TabellenDelegateHelper.findColumns(delegate)}" varStatus="loop">
            <rich:column>
                <f:facet name="header">
                    <h:outputText value="#{theColumn}" />
                </f:facet>
                <!-- stripped dynamic content -->
            </rich:column>
        </c:forEach>
    </rich:dataTable>

</f:subview>
这两个循环产生不同的结果:

以前有人经历过这种情况吗?我不相信JSTL Core有缺陷。。。但到目前为止我没有其他线索

更奇怪的是。。。如果我颠倒顺序并在
之前追加
,则即使上表显示了错误,集合也是正确的。使用
之前的
之前的
第一个输出中断,第二个和第三个输出正确

让它更详细一点。。。以下
是该方法返回的列:

private static final String COL_FIRSTNAME  = "firstname";
private static final String COL_LASTNAME   = "lastname";
private static final String COL_TEAM       = "team";
private static final String COL_POSITION   = "position";
private static final String COL_ASSIGNMENT = "Aktion";

private static final List<String> COLUMNS = Arrays.asList(COL_FIRSTNAME, COL_LASTNAME, COL_TEAM, COL_POSITION, COL_ASSIGNMENT);
private静态最终字符串COL_FIRSTNAME=“FIRSTNAME”;
私有静态最终字符串COL_LASTNAME=“LASTNAME”;
私有静态最终字符串COL_TEAM=“TEAM”;
私有静态最终字符串COL_POSITION=“POSITION”;
私有静态最终字符串COL_ASSIGNMENT=“Aktion”;
私有静态最终列表列=Arrays.asList(COL_FIRSTNAME、COL_LASTNAME、COL_团队、COL_位置、COL_分配);

请添加
TabellenDelegateHelper.findColumns(委托)
是静态方法,返回静态列变量吗?它是一个简单的
公共列表findColumns(TabellenDelegate委托){return delegate.findColumns();}
返回精确的静态列表。我还仔细检查了委托是否正确。请尝试每次在该助手方法中返回新集合。(将列替换为Arrays.asList(…))我不知道forEach内部是如何实现的,但在多线程环境中迭代可变的非同步静态集合在任何情况下都不是一个好主意。已经尝试过了<代码>返回集合.不可修改列表(数组.asList(COL_FIRSTNAME,COL_LASTNAME,COL_团队,COL_位置,COL_分配))没有为我更改任何内容。。。非常奇怪。该表是
表的一部分。xhtml
通过
委托
重用。。。但是
table.xhtml
本身以一个
开头,用于分隔所有组件ID的名称空间。到目前为止,我只能在同一个页面上复制超过1个
table.xhtml
的bug。。。所以这可能是相关的。我已经在描述中添加了这个细节。
<c:forEach var="theColumn" items="#{TabellenDelegateHelper.findColumns(delegate)}" varStatus="loop">
    <h:outputText value="#{theColumn}, " />
</c:forEach>
<br/>
<ui:repeat var="theColumn" value="#{TabellenDelegateHelper.findColumns(delegate)}" varStatus="loop">
    <h:outputText value="#{theColumn}; " />
</ui:repeat>
private static final String COL_FIRSTNAME  = "firstname";
private static final String COL_LASTNAME   = "lastname";
private static final String COL_TEAM       = "team";
private static final String COL_POSITION   = "position";
private static final String COL_ASSIGNMENT = "Aktion";

private static final List<String> COLUMNS = Arrays.asList(COL_FIRSTNAME, COL_LASTNAME, COL_TEAM, COL_POSITION, COL_ASSIGNMENT);