JSF:嵌套ui:repeat中的值绑定

我对标签有一个奇怪的问题。 即使对于我非常简单的示例,嵌套重复组件内的值绑定也无法按预期工作。

我有一个像这样的简单小面孔:

        

和沙盒类:

 @Component @Scope("request") public class Sandbox { public static class Row { private List columns = Arrays.asList(new Column(), new Column()); public List getColumns() { return columns; } } public static class Column { private boolean value; public void setValue(boolean value) { this.value = value; } public boolean getValue() { return this.value; } } public List rows = Arrays.asList(new Row(), new Row()); public List getRows() { return rows; } public void refresh() { rows.get(0).getColumns().get(0).setValue(true); System.err.println("refresh clicked"); } } 

所以我的facelet循环遍布沙盒中的“行”,沙盒中有许多“列”,每个列都有一个值。 对于每个此类列,将打印该值,并输出一个 ,其值已绑定到该列。

当我加载页面时,所有值都显示为false,并且所有复选框都未选中。 现在,单击refresh应该将第一行第一列的值更改为true。 但是,我得到以下输出:

真假 [ ]
 false [] false []

换句话说, 显示为true,但选中该复选框。 当然我可以在调用应用程序阶段更改模型,在渲染视图时应该反映出来吗?

如果我删除了一个级别的嵌套,那么只有一个 ,一切都按预期工作:选中复选框并将值显示为true。 所以这似乎与UIRepeat组件有关。 事实上,似乎UIRepeat在它嵌套在另一个UIRepeat中时有一些特殊处理。

从我收集的内容来看,UIRepeat基本上会多次重新渲染相同的组件。 在每次调用render之间,它从内部映射(以渲染组件的实际id为键)加载实现EditableValueHolder的所有子组件的“state”(value,localValue,submittedValue)。 我已经尝试在发生这种情况时设置断点来跟踪在已保存状态的映射中插入了什么值,但它实际上是一团糟,因为saveChildState和restoreChildState方法被调用了大约数十亿次。

有任何想法吗? 我可以这样做吗? 我真正需要的是能够呈现一个水平和垂直动态增长的表,包含复选框,输入字段等。我瞥了一眼但我相信它在这种情况下不起作用。

有趣的问题。 我可以用Mojarra 2.0.3重现这个。 这绝对是ui:repeat状态保存问题ui:repeat 。 我已经向Mojarra家伙报告了1807号问题 。 当外循环是c:forEach时,它的工作方式很好。