我使用带模型的超级菜单更改了我的静态菜单文件(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 AbstractMenu和Marlon Patrick's solution (PT-BR)。
根本不起作用= [
编辑 - &gt;创建MenuItem
MenuItem anItem = new MenuItem();
anItem.setOutcome(item.getOutcome());
anItem.setValue(item.getRotulo());
anItem.setIcon(item.getIcone());
答案 0 :(得分:2)
从我看到你已经尝试了我的两个解决方法:覆盖AbstractMenu并放入PhaseListener。
嗯,我意识到我遇到问题的组件是MenuBar以及你想要使用的是MegaMenu,也许是我不适用于MegaMenu的解决方案,尽管我认为应该可行。< / p>
我要对你说的是检查以下内容:
1 - 当你覆盖AbstractMenu类时,你确定PrimeFaces开始使用它吗?确保它在那里放置一个断点并且如果他看到执行流程。如果你没有停止,因为PrimeFaces仍然使用自己的类。
2 - 当我尝试使用PhaseListener的解决方案时,我更喜欢并使用它,你注意到你需要用自己的代码替换一段代码?基本上,您只需要删除链接菜单项的操作,因为它们会导致此问题。菜单项是应该保留的操作。在我的情况下,我知道ID是什么动作或链接,那么你将不得不以某种方式区分相信id。另外,设置一个断点,以确保您的PhaseListener已正式注册,并且正在拦截执行流程。