我用带有模型的超级菜单更改了静态菜单文件(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">
并且这个:
所以。。。我真的不明白。我的菜单控制器是一个会话Bean:
@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也停止了)。
我尝试了一些变通办法,但没有成功。这是我尝试过的:重写AbstractMenu和Marlon Patrick的解决方案(PT-BR)。
根本不起作用=[
编辑->创建菜单项
MenuItem anItem = new MenuItem();
anItem.setOutcome(item.getOutcome());
anItem.setValue(item.getRotulo());
anItem.setIcon(item.getIcone());
据我所见,您已经尝试了我的两种解决方案:覆盖AbstractMenu和放置PhaseListener。
好吧,我意识到,我的MenuBar和你试图使用的问题所在的组件是MegaMenu,也许是我不适用于MegaMenu的解决方案,尽管我相信这应该是可行的。
我想对你说的是检查以下内容:
1-当你覆盖类AbstractMenu时,你确定PrimeFaces开始使用它了吗?为了确保它在那里设置了一个断点,以及他是否看到了执行流程。如果不停止,因为PrimeFaces仍在使用自己的类。
2-在尝试使用PhaseListener解决方案时,我今天更喜欢使用它,您注意到您需要用自己的代码替换一段代码?基本上,你只需要删除作为链接的菜单项的操作,因为它们会导致这个问题。菜单项是应该保留的操作。在我的情况下,我通过ID知道什么是操作或链接,然后你必须通过ID来区分。此外,设置一个断点,以确保你的PhaseListener已正式注册,这就是拦截执行流。