org.primefaces.model.menu.DefaultSubMenu нельзя преобразовать в javax.faces.component.UIComponent - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь обновить PrimeFaces 3.5 до PrimeFaces 4.0, строка кода, которая подходит для версии 3.5, такова:

private MenuModel modelPrincipal;
private Menubar menuBar;

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

Но когда я обновляюсь до версии 4.0, я должен изменить ее какследует:

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

Я также пытался:

menuBar.getElements().addAll(modelPrincipal.getElements());

Но дает мне то же исключение

Любая помощь приветствуется

РЕДАКТИРОВАТЬ (минимально (это минимально, поскольку я могу сделать так, чтобы код отображал ошибку) Воспроизводимый пример):

Это PrimeFaces 4.0:

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;
    }
}

1 Ответ

1 голос
/ 11 июля 2019

Класскаст в

 menuBar.getChildren().addAll((Collection<? extends UIComponent>) modelPrincipal.getElements());

является своего рода логичным, поскольку элементы org.primefaces.model.menu.DefaultMenuItem в модели никоим образом не являются компонентом UIComponent (вы можете убедиться в этом, следуя источнику до базового класса / интерфейса). Даже если бы вы не явным образом произвели это, он потерпел бы ошибку с той же ошибкой, но в другой строке другого класса.

делает

menuBar.getElements().addAll(modelPrincipal.getElements());

Сбой по той же причине. Если бы вы проверили код в методе getElements() в menuBar, вы бы увидели

public List getElements() {
    MenuModel model = getModel();
    if (model != null) {
        return model.getElements();
    }
    else {
        return getChildren();
    }
}

Вы могли бы даже отладить его и увидеть, что модель была нулевой, и тогда getChildren() будет возвращен, фактически заканчивая теми же вызовами, что и в вашей первой попытке. Но ...

Вы также увидите там getModel(), возможно, подсказку, где искать решение. Панель меню имеет setModel(...), где вы можете установить модель, которую вы создали программно. Таким образом, решение для этого

menuBar.setModel(modelPrincipal);

ЕСЛИ вы создаете панель меню программно.

Но чаще всего он добавляется в xhtml через

<p:menu model="#{menuBean.model}" />

Некоторые дополнительные подсказки:

  • В результате поиска "primefaces menu model 4.0 3.5" были получены хиты, которые дали бы вам помощь / подсказки (по крайней мере, тогда мне показывал G00gle)
  • ввод 'menumodel' в документации по PrimeFaces 7 дал бы подсказку для части динамического меню в универсальном компоненте меню, имея полный полный пример. https://primefaces.github.io/primefaces/7_0/#/components/menu
  • Наличие IDE с дополнением кода в java-коде или xhtml и проверка API показали бы метод setModel или атрибут model.

Но я согласен, немного больше объяснений в документе о миграции помогло бы, но в то время (когда я по крайней мере мигрировал с 3,5 на 4) это упоминалось на форумах и т. Д., Поэтому оно было «актуальным» в то время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...