アイテムのリストがあり、メニューモデルを一度作成する Bean があります。
@ManagedBean
@SessionScoped
public class ItemController implements Serializable{
private List<Item> items; //list of items (String, id)
private MenuModel model;
public void loadMenu(){
model = new DefaultMenuModel();
ELContext elCtx = FacesContext.getCurrentInstance().getELContext();
ExpressionFactory expFact = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
Submenu submenu = new Submenu();
submenu.setLabel("Your items:");
for(int i = 0; i < items.size(); i++){
MenuItem item = new MenuItem();
item.setId("lm" + items.get(i).getId());
item.setValue(items.get(i).getName());
item.setAjax(false); //sonst setupdate setzen!
item.setActionExpression(expFact.createMethodExpression(elCtx, "#{itemController.loadItem("+items.get(i).getId()+")}", Void.class, new Class[]{Integer.class}));
submenu.getChildren().add(item);
}
model.addSubmenu(submenu);
}
public void loadItem(int id){
System.out.println("EXECUTED: " + id);
}
// ...getters and setters here...
}
しかし、メニュー項目をクリックするたびに、「loadItem(int id)」メソッドが最後にクリックされたときよりも 1 回多く実行されます。
たとえば、ロガーは次のように出力します。
- 最初のクリック時:「EXECUTED 1」
- 2 回目のクリック (同じメニュー項目): "EXECUTED 1" "EXECUTED 1"
- 3 回目のクリック (同じメニュー項目): "EXECUTED 1" "EXECUTED 1" "EXECUTED 1"
- 等々
ページに URL をリロードさせると、リセットされて最初からやり直します。更新しても何も変わりません。同じメニューを手動で作成すると、完全に機能します。バグですか?
誰でも助けることができますか?メニュー項目がこのように機能する理由はわかりません。