我试图从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;
}
}
发布于 2019-07-11 19:27:28
全班演员
menuBar.getChildren().addAll((Collection<? extends UIComponent>) modelPrincipal.getElements());
这有点逻辑,因为模型中的org.primefaces.model.menu.DefaultMenuItem
元素从任何方面来说都不是UIComponent (您可以通过跟踪源代码到基类/接口来看到这一点)。即使您没有显式地抛出这个问题,它也会失败,但在另一个类中的另一行上也会出现同样的错误。
做
menuBar.getElements().addAll(modelPrincipal.getElements());
因为同样的原因失败了。如果您检查了menuBar
中的menuBar
方法中的代码,就会看到
public List getElements() {
MenuModel model = getModel();
if (model != null) {
return model.getElements();
}
else {
return getChildren();
}
}
您甚至可以调试它,并看到模型为null,然后返回getChildren()
,有效地结束了与第一次尝试相同的调用。但是..。
您还可以在其中看到getModel()
,可能是在哪里寻找解决方案的提示。menuBar有一个setModel(...)
,您可以在其中设置以编程方式创建的模型。所以解决这个问题的方法是
menuBar.setModel(modelPrincipal);
如果以编程方式创建menuBar。
但大多数情况下,它被添加到xhtml中
<p:menu model="#{menuBean.model}" />
还有一些提示:
setModel
方法或model
属性。但我同意,在迁移文档中做一些更多的解释会有所帮助,但在当时(至少我从3.5迁移到4),论坛上提到了这一点。所以当时是“真实的”
https://stackoverflow.com/questions/56975225
复制相似问题