我现在花了大约3个小时用以下代码片段调试一个奇怪的行为。我正在使用动态<rich:dataTable>
和<c:forEach>
在运行时包含一组不断变化的<rich:column>
元素。
这在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>
使用以下代码段将该代码包含在多个视图中:
<ui:include src="/WEB-INF/templates/shared/tabelle.xhtml">
<ui:param name="delegate" value="#{myTable}" />
</ui:include>
在调试甚至使用简单的System.out.println(...)
语句时,TabellenDelegateHelper.findColumns(delegate)
返回的集合总是包含预期的(不是加倍的)元素。
为了进一步调查,我在表格之后添加了一些标签:
<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>
这两个循环产生不同的结果:
以前有没有人经历过这个?我不相信JSTL Core是错误的...但到目前为止我没有其他线索。
更奇怪的是......如果我颠倒顺序并在<ui:repeat>
之前附加<c:forEach>
集合是正确的,即使上表显示了错误。在<c:forEach>
<ui:repeat>
之前<c:forEach>
使用COLUMNS
,第一个被破坏,第二个+第三个输出正确。
为了使它更加详细......以下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);
是方法返回的:
{
"app_Welcome": "Welcome",
"app_Notifications": "Notifications",
"app_New": "New"
}