0

我用带有模型的巨型菜单更改了我的静态菜单文件(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)

根本行不通=[

编辑-> 创建菜单项

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

1 回答 1

2

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

好吧,我意识到我遇到的问题是 MenuBar 的组件,而您尝试使用的是 MegaMenu,也许是我不适用于 MegaMenu 的解决方案,尽管我相信应该可以。

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

1 - 当您覆盖类 AbstractMenu 时,您确定 PrimeFaces 开始使用它吗?以确保它在那里放置一个断点以及他是否看到执行流程。如果不停止,因为 PrimeFaces 仍在使用它自己的类。

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

于 2013-02-13T18:04:25.997 回答