0

アイテムのリストがあり、メニューモデルを一度作成する 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 をリロードさせると、リセットされて最初からやり直します。更新しても何も変わりません。同じメニューを手動で作成すると、完全に機能します。バグですか?

誰でも助けることができますか?メニュー項目がこのように機能する理由はわかりません。

4

0 に答える 0