我目前正在为复合组件实现支持组件。我在请求期间使用状态助手来保持内部状态,我发现了一个我无法向自己解释的奇怪行为。
复合组件有一个按钮,可将新项目添加到 ArrayList。此列表由我自己创建并添加到状态中。这是代码:
public void buttonActionListener() {
List<Item> itemList = getItemList();
if(itemList == null) {
itemList = new ArrayList<>();
setItemList(itemList);
}
itemList.add(item);
}
public List<Item> getItemList() {
return (List<Item>) getStateHelper().get(PropertyKeys.itemList);
}
private void setItemList(List<Item> itemLis) {
getStateHelper().put(PropertyKeys.itemList, itemList);
}
该列表显示在带有数据表的复合组件中。在第一个请求/按钮单击后,我有一个包含一个项目的列表。第二次单击将显示数据表中的两个项目,但似乎没有任何内容存储到状态助手中。因为第三次单击只显示项目#1 和#3,但#2 丢失。每次后续点击将始终只显示项目#1 和#n。
但是当我使用
public void buttonActionListener() {
addItemList(item);
}
public List<Item> getItemList() {
return (List<Item>) getStateHelper().get(PropertyKeys.itemList);
}
private void addItemList(Item item) {
getStateHelper().add(PropertyKeys.itemList, item); // add instead of put
}
一切都按预期工作。StateHelper 中的两种方法(实现)几乎相同。请你能解释一下发生了什么吗?
过去我在测试时也有类似的行为。但是此时我没有使用列表,而只是在状态保存中应该更改的项目。我总是得到第一个添加的状态,从来没有改变过的状态。
我在 JBoss 7.1.3 上使用 Mojarra 2.1.28。