Primefaces Dynamic Mega菜单 - 无法删除相同的组件两次

时间:2013-02-13 17:23:14

标签: jsf primefaces

我使用带模型的超级菜单更改了我的静态菜单文件(header.xhtml)。 像这样:

          <p:megaMenu model="#{menuController.megaModel}" autoDisplay="false" styleClass="menu-bar"  >

          </p:megaMenu>

到目前为止一直很好,它的工作很好,并且像我预期的那样建造。 问题是,在我的表单页面上,验证在一段时间内失败了...... 我收到这个错误:

 javax.faces.FacesException: Cannot remove the same component twice: j_idt15:j_id2     com.sun.faces.context.StateContext$AddRemoveListener.handleAddRemoveWithAutoPrune(StateContext.java:493)
        com.sun.faces.context.StateContext$AddRemoveListener.handleRemove(StateContext.java:372)

查看生成的HTML我找不到这个字符串“j_idt15:j_id2”,但我可以找到:

   <div id="j_idt14:j_idt15" class="ui-menu ui-menubar ui-megamenu ui-widget ui-widget-content ui-corner-all ui-helper-clearfix menu-bar" role="menubar">

并且:        

所以......我真的不明白。我的MenuController是一个sessionBean:

@Component
@Scope("session")
public class MenuController implements Serializable {

@PostConstruct
   public void init(){
   todosModulos = moduloService.findAll();
   modulosAcesso = extrairModulos();
   createMegaMenu();
}

...所以...有些注意事项:

我发现在高于2.1.9的Mojarra版本上会出现此错误。 (我使用的是2.1.10)。因此,一种可能的解决方案是将JSF imp更改为My Faces。 我试过这个,但它打破了我的结构(我的复合组件停止工作和dynaForm)。

我尝试了一些解决方法,但没有成功。这是我试过的: Overriding AbstractMenuMarlon Patrick's solution (PT-BR)

根本不起作用= [

编辑 - &gt;创建MenuItem

 MenuItem anItem = new MenuItem();
 anItem.setOutcome(item.getOutcome());
 anItem.setValue(item.getRotulo());
 anItem.setIcon(item.getIcone());       

1 个答案:

答案 0 :(得分:2)

从我看到你已经尝试了我的两个解决方法:覆盖AbstractMenu并放入PhaseListener。

嗯,我意识到我遇到问题的组件是MenuBar以及你想要使用的是MegaMenu,也许是我不适用于MegaMenu的解决方案,尽管我认为应该可行。< / p>

我要对你说的是检查以下内容:

1 - 当你覆盖AbstractMenu类时,你确定PrimeFaces开始使用它吗?确保它在那里放置一个断点并且如果他看到执行流程。如果你没有停止,因为PrimeFaces仍然使用自己的类。

2 - 当我尝试使用PhaseListener的解决方案时,我更喜欢并使用它,你注意到你需要用自己的代码替换一段代码?基本上,您只需要删除链接菜单项的操作,因为它们会导致此问题。菜单项是应该保留的操作。在我的情况下,我知道ID是什么动作或链接,那么你将不得不以某种方式区分相信id。另外,设置一个断点,以确保您的PhaseListener已正式注册,并且正在拦截执行流程。