Jsf 2 ui内Primefaces ManyCheckbox:仅对最后一个循环重复调用setter方法

Jsf 2 ui内Primefaces ManyCheckbox:仅对最后一个循环重复调用setter方法,jsf-2,checkbox,primefaces,omnifaces,selectmanycheckbox,Jsf 2,Checkbox,Primefaces,Omnifaces,Selectmanycheckbox,我在中有一个,从某个对象类的列表中获取它的项(由-变量提供),并且应该将所选项保存到同一对象类的另一个列表中。但是它只为最后一个条目调用setter方法{cartBean.setSelectedExtras}(最后一次迭代) 这个结构对我来说很好 如中所述,默认情况下,omnifaces.SelectItemsConverter使用复杂对象的toString()表示形式作为转换的项值。因此,如果您没有重写toString()方法(因此它仍然默认为com.example)。SomeClass@ha

我在
中有一个
,从某个对象类的列表中获取它的项(由
-变量提供),并且应该将所选项保存到同一对象类的另一个列表中。但是它只为最后一个条目调用setter方法
{cartBean.setSelectedExtras}
(最后一次迭代


这个结构对我来说很好

如中所述,默认情况下,
omnifaces.SelectItemsConverter
使用复杂对象的
toString()
表示形式作为转换的项值。因此,如果您没有重写
toString()
方法(因此它仍然默认为
com.example)。SomeClass@hashcode
在每次实例化时都会更改)并且
#{item}
托管bean是请求作用域,那么列表基本上在每次HTTP请求时都会更改。这将导致“验证错误:值无效”错误

如果你加上

<p:messages autoUpdate="true" />
或者,您可以将
#{item}
托管bean放在更广的范围内,例如视图范围


Update至于您的更新,您将所有复选框组的选定值绑定到一个相同的bean属性
#{cartBean.selectedExtras}
。这样,每次迭代都会使用当前迭代轮中的值覆盖属性,直到最后一次迭代的值结束为止。如果在setter上放置了调试断点,您会注意到这一点

这是不对的。它们应该分别指向不同的bean属性。从技术上讲,您应该有一个
#{item.selectedExtras}
作为属性。但我认为这在你目前的设计中毫无意义。最好是使
{cartBean.selectedExtras}
成为
列表
项[][]
。通过这种方式,您可以根据迭代索引设置它们,如下所示:

<ui:repeat var="item" value="#{category.items}" varStatus="iteration">
    <p:selectManyCheckbox id="extraCheckbox" value="#{cartBean.selectedExtras[iteration.index]}" layout="pageDirection" converter="omnifaces.SelectItemsConverter">  
         <f:selectItems value="#{item.items5}" var="extra" itemLabel="#{extra.name}"/>
    </p:selectManyCheckbox>
</ui:repeat>
对于
项[]【】
,您只需

selectedExtras = new Item[category.getItems().size()];

你需要发布更多的代码。请发布一些支持bean的代码。@Catfish我编辑了我的问题。实际上,我认为没有任何有趣的支持bean代码。正如您现在看到的,
{item}
{cartBean.selectedExtras}
指向
列表的简单setter/getter方法,就像
{item.items5}
是一个变量,
{category.items}
也是一个变量一样。感谢您的努力。也许我真的发布了一些小代码。实际上,本例中的
{item}
是来自更高级别的
的变量-似乎没有任何范围相关的问题。我注意到,问题并不是很多复选框,而是我的前两个条目有复选框:setter方法只是在前两个条目上没有被调用。另一个(也)创建的条目和它们的复选框工作正常(setter方法称为).Hmm。。。它不是setter没有调用的前两个
创建的条目:它只是调用setter方法的最后一个条目。这是一个暗示。。。但我还是没有发现问题,我编辑了我的问题。我真的很抱歉没有提供足够的信息就占用了你的时间。我不清楚问题的背景,我总是担心发布大量不相关的代码。将来,您最好尝试用一个空白bean创建一个空白视图,然后用尽可能最小的代码填充
,以这种方式演示/再现整个问题,其他人应该能够通过将其复制粘贴到他们的环境中来完成同样的操作。然后,将整个
内容复制到你的问题中。哇,这仍然让我很难回答。在此之前,我使用了一个
来代替每个复选框,并为所有复选框使用了属性
{cartBean.selectedExtras}
。毫无疑问,这就像你说的,但我没有真正改变我以前的方法,而是感到头痛。你介意向我指出这个区别吗?我仍在努力实施你的方法。我以前曾经在backingbean端有一个列表,但我对JSF端的EL绝对不熟悉。关于更多信息的提示?:D
<p:messages autoUpdate="true" />
<p:growl autoUpdate="true" />
@Override
public String toString() {
    return "Extra[id=" + id + "]";
}
<ui:repeat var="item" value="#{category.items}" varStatus="iteration">
    <p:selectManyCheckbox id="extraCheckbox" value="#{cartBean.selectedExtras[iteration.index]}" layout="pageDirection" converter="omnifaces.SelectItemsConverter">  
         <f:selectItems value="#{item.items5}" var="extra" itemLabel="#{extra.name}"/>
    </p:selectManyCheckbox>
</ui:repeat>
for (Item item : category.getItems()) {
    selectedExtras.add(null);
}
selectedExtras = new Item[category.getItems().size()];