首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不能将org.primefaces.model.menu.DefaultSubMenu转换为javax.faces.component.UIComponent

不能将org.primefaces.model.menu.DefaultSubMenu转换为javax.faces.component.UIComponent
EN

Stack Overflow用户
提问于 2019-07-10 16:45:40
回答 1查看 1.2K关注 0票数 1

我试图从PrimeFaces 3.5升级到PrimeFaces 4.0,这一行代码在3.5版上很好,就是这样的:

代码语言:javascript
运行
复制
private MenuModel modelPrincipal;
private Menubar menuBar;

menuBar.getChildren().addAll(modelPrincipal.getContents());

但是,当我升级到4.0版时,我必须将其更改如下:

代码语言:javascript
运行
复制
private org.primefaces.model.menu.DefaultMenuModel modelPrincipal;
private Menubar menuBar;
menuBar.getChildren().addAll((Collection<? extends UIComponent>) modelPrincipal.getElements());

除了标题,你们知道解决办法吗?我在迁移https://github.com/primefaces/primefaces/wiki/Migration-Guide的文档中找不到任何东西

我也试过:

代码语言:javascript
运行
复制
menuBar.getElements().addAll(modelPrincipal.getElements());

但也给了我同样的例外

任何帮助都是非常感谢的。

编辑(最小(这是我所能做的使错误出现的最小值)可复制的示例):

这里是PrimeFaces 4.0:

代码语言:javascript
运行
复制
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;

import javax.faces.component.UIComponent;

import org.primefaces.component.menubar.Menubar;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultSubMenu;

public class MenuExampleMB {
    private org.primefaces.model.menu.DefaultMenuModel modelPrincipal;
    private Menubar menuBar;
    private HashMap<String, SubMenuItemObject> menuUrlCodigos;

    public static void main(String[] args) {
        MenuExampleMB menuExampleMB = new MenuExampleMB();
        // MenuList
        List<MenuObject> menuList = new ArrayList<>();
        // SubMenuItemList
        List<SubMenuItemObject> subMenuList = new ArrayList<>();
        // Add 1 item to the SubMenuItemList
        subMenuList.add(new SubMenuItemObject("1", "SubMenu", "an url"));
        // MenuObject
        MenuObject menu1 = new MenuObject("Menu 1");
        // Set the SubMenu list for this MenuObject
        menu1.setlSubmenus(subMenuList);
        menuList.add(menu1);
        // Call method that brings the Exception
        menuExampleMB.loadMenu(menuList);
    }

    public void loadMenu(List<MenuObject> lMenus) {

        menuUrlCodigos = new HashMap<String, SubMenuItemObject>();
        modelPrincipal = new org.primefaces.model.menu.DefaultMenuModel();
        menuBar = new Menubar();
        // Go through the list of MenuObject and create each SubMenu and add them to
        // DefaultMenuModel
        for (MenuObject menu : lMenus) {
            DefaultSubMenu subMenu = new DefaultSubMenu();
            subMenu = agregarSubmenu(menu.getlSubmenus());
            subMenu.setLabel(menu.getTitulo());
            modelPrincipal.addElement(subMenu);
        }
        // This is the one that brings the exception.
        menuBar.getChildren().addAll((Collection<? extends UIComponent>) modelPrincipal.getElements());

    }

    private DefaultSubMenu agregarSubmenu(List<SubMenuItemObject> lSubMenuUsuario) {

        DefaultMenuItem menuItem = null;
        DefaultSubMenu subMenuPadre = new DefaultSubMenu();

        for (SubMenuItemObject subMenuItem : lSubMenuUsuario) {

            // Ask if this submenu has sons
            if (subMenuItem.getlSubmenus().size() > 0) {

                DefaultSubMenu subMenuHijo = new DefaultSubMenu();
                subMenuHijo.setLabel(subMenuItem.getTitulo());

                /*
                 * Invoke this method with recursivity to get all the sons of this menu
                 * 
                 */
                subMenuHijo.getElements().addAll(agregarSubmenu(subMenuItem.getlSubmenus()).getElements());

                // Add sons to the father submenu.
                subMenuPadre.getElements().add(subMenuHijo);

            } else {
                // This submenu doesn't have sons so its created as an unique son of the
                // father submenu.
                menuItem = agregarItem(subMenuItem);
                subMenuPadre.getElements().add(menuItem);
                subMenuPadre.setLabel(subMenuItem.getTitulo());
            }

        }

        return subMenuPadre;
    }

    private DefaultMenuItem agregarItem(SubMenuItemObject pSubMenuItem) {
        DefaultMenuItem menuItem = new DefaultMenuItem();
        menuItem.setValue(pSubMenuItem.getTitulo());
        menuItem.setUrl(pSubMenuItem.getUrl());

        menuUrlCodigos.put(pSubMenuItem.getUrl(), pSubMenuItem);

        return menuItem;
    }

}

class MenuObject {
    private String titulo;
    private List<SubMenuItemObject> lSubmenus = new ArrayList<SubMenuItemObject>();

    public MenuObject(String pTitulo) {
        titulo = pTitulo;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public List<SubMenuItemObject> getlSubmenus() {
        return lSubmenus;
    }

    public void setlSubmenus(List<SubMenuItemObject> lSubmenus) {
        this.lSubmenus = lSubmenus;
    }
}

class SubMenuItemObject {
    private String codigo;
    private String titulo;
    private String url;
    private List<String[]> lJerarquia;
    private List<String> lTabs;
    private List<SubMenuItemObject> lSubmenus = new ArrayList<SubMenuItemObject>();

    public SubMenuItemObject(String pCodigo, String pTitulo, String pUrl) {
        codigo = pCodigo;
        titulo = pTitulo;
        url = pUrl;
        lJerarquia = new ArrayList<String[]>();
    }

    public SubMenuItemObject() {

    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public List<SubMenuItemObject> getlSubmenus() {
        return lSubmenus;
    }

    public void setlSubmenus(List<SubMenuItemObject> lSubmenus) {
        this.lSubmenus = lSubmenus;
    }

    public List<String[]> getlJerarquia() {
        return lJerarquia;
    }

    public void setlJerarquia(List<String[]> lJerarquia) {
        this.lJerarquia.clear();
        this.lJerarquia.addAll(lJerarquia);
    }

    public List<String> getlTabs() {
        return lTabs;
    }

    public void setlTabs(List<String> lTabs) {
        this.lTabs = lTabs;
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2019-07-11 19:27:28

全班演员

代码语言:javascript
运行
复制
 menuBar.getChildren().addAll((Collection<? extends UIComponent>) modelPrincipal.getElements());

这有点逻辑,因为模型中的org.primefaces.model.menu.DefaultMenuItem元素从任何方面来说都不是UIComponent (您可以通过跟踪源代码到基类/接口来看到这一点)。即使您没有显式地抛出这个问题,它也会失败,但在另一个类中的另一行上也会出现同样的错误。

代码语言:javascript
运行
复制
menuBar.getElements().addAll(modelPrincipal.getElements());

因为同样的原因失败了。如果您检查了menuBar中的menuBar方法中的代码,就会看到

代码语言:javascript
运行
复制
public List getElements() {
    MenuModel model = getModel();
    if (model != null) {
        return model.getElements();
    }
    else {
        return getChildren();
    }
}

您甚至可以调试它,并看到模型为null,然后返回getChildren(),有效地结束了与第一次尝试相同的调用。但是..。

您还可以在其中看到getModel(),可能是在哪里寻找解决方案的提示。menuBar有一个setModel(...),您可以在其中设置以编程方式创建的模型。所以解决这个问题的方法是

代码语言:javascript
运行
复制
menuBar.setModel(modelPrincipal);

如果以编程方式创建menuBar。

但大多数情况下,它被添加到xhtml中

代码语言:javascript
运行
复制
<p:menu model="#{menuBean.model}" />

还有一些提示:

  • 搜索"primefaces菜单模式4.03.5“会得到一些帮助/提示(至少G00gle当时给了我一些提示)。
  • 在PrimeFaces 7文档中输入'menumodel‘将提示泛型菜单组件中的动态菜单部分,有一个完整的示例。0/#/components/menu
  • 拥有一个在java代码或xhtml中完成代码的IDE,并检查api,将显示setModel方法或model属性。

但我同意,在迁移文档中做一些更多的解释会有所帮助,但在当时(至少我从3.5迁移到4),论坛上提到了这一点。所以当时是“真实的”

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56975225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档