将 Primefaces 6.2 迁移到 Primefaces 8.0 时的 menuitem 问题

menuitem issue on migration Primefaces 6.2 to Primefaces 8.0

提问人:mulivieri 提问时间:11/30/2022 最后编辑:Jasper de Vriesmulivieri 更新时间:11/30/2022 访问量:78

问:

我参与了将Java Web应用程序从Primefaces 6.2迁移到Primefaces 8.0的工作。 按照官方迁移指南解决所有问题后,应用程序可以正常工作,但 p:menubutton 组件上的行为除外。

它涉及生成数据表的 xhtml,其中一列包含由 p:menubutton 组件上的属性模型呈现的 DefaultMenuItem 对象。

问题: 我第一次调用每个 DefaultMenuItem 中设置的操作之一时,它就可以工作了。该操作将打开一个对话框,但在不执行新提交的情况下关闭打开的对话框,第二次调用不会产生任何输出。我可以在浏览器控制台的网络选项卡中评估ajax请求,听起来没有任何问题,它等于第一次调用。 服务器控制台和浏览器控制台中都没有错误。这在Primefaces 6.2上没有发生。 迁移前后涉及的所有组件都是相同的。

代码如下:

List.xhtml 包含 p:menubutton 组件的 UI:组合

<ui:composition>
        
    <h:form id="someForm" enctype="multipart/form-data">
    
        <p:menuButton 
            model="#{SomeBean.model}"
            id="idmenubutton" 
            icon="fa fa fa-ellipsis-v"
            menuStyleClass="response-single-style" 
            title="some_title"
            disabled="false"/>
    
    </h:form>
</ui:composition>

dialog.xhtml 调用在每个 DefaultMenuItem 上设置的操作后呈现的 ui:组合

<ui:composition>

    <p:importEnum type="some.path.SomeEnum" var="someEnum"/>

    <p:dialog id="idDlgGeneric" header="some_header" styleClass="generic_pnlMaxWidth95" 
              widgetVar="dlgGeneric" modal="true" onShow="dlgOnShow(this.jqId);onShowForClosableDlg('dlgGeneric')"
              responsive="true" fitViewport="true" showEffect="fade" hideEffect="fade" resizable="false" closable="true">
        
        <p:panel rendered="true">
            <p:panelGrid layout="grid" columns="2" columnClasses="ui-grid-col-6,ui-grid-col-6" styleClass="ui-panelgrid-blank">
                <p:commandButton id="saveDlg" icon="fa fa-pencil" value="Save" action="#{SomeOtherBean.save}" styleClass="generic_width100"/>
                <p:commandButton icon="fa fa-times" value="Close" action="#{SomeBean.destroyBeanViewScope('SomeOtherBean')}" onclick="PF('dlgGeneric').hide()" styleClass="generic_width100 uniqueCloseButton"/>
                <p:defaultCommand target="@form:saveSomeOtherBean" scope="@form:idDlgGeneric" />
            </p:panelGrid>
        </p:panel>
        
    </p:dialog>

</ui:composition>

SomeBean.java 初始化用于 p:menubutton 组件的模型的类

@Named(ConstantsWeb.MBean.SOME_BEAN)
@ViewScoped
public class SomeBean extends AbstractBean {

    private transient MenuModel model;
    
    public MenuModel initModel() {
        
                model = new DefaultMenuModel();
                final DefaultMenuItem title = DefaultMenuItem.builder()
                        .value("value_description")
                        .disabled(true)
                        .style("opacity:1;font-weight:bold;")
                        .build();
                model.getElements().add(title);

                for (final SomeEnum resp : responsSingle) {
                    Map<String, List<String>> map = new LinkedHashMap<String, List<String>>();
                    List<String> list = new ArrayList<String>();
                    list.add(String.valueOf(resp.getId()));
                    map.put("respId", list);
                    
                    final DefaultMenuItem menuItem = DefaultMenuItem.builder()
                            .value(resp.getDisplayName())
                            .command("#{SomeBean.someMethod}")
                            .params(map)
                            .onstart("PF('statusDialog').show();")
                            .onsuccess("PF('statusDialog').hide();")
                            .update(someForm:idDlgGeneric)
                            .icon(resp.getIcon())
                            .disabled(false)
                            .build();
                    model.getElements().add(menuItem);
                }

                model.generateUniqueIds();
            }
        } else {
            model = null;
        }
        return model;
    }
    
    public void someMethod() {
        
    }
    
    public void destroyBeanViewScope(final String... yourBeanArray) {
        FacesHelper.destroyBeanViewScope(yourBeanArray);
        renderResponse = false;
        FacesHelper.update(someForm:idDlgGeneric);
    }
}

有人可以帮助我吗?

Ajax JSF primefaces XHTML

评论

1赞 Melloware 12/3/2022
嗯,你的代码看起来是正确的,所以一定有什么东西不对劲。如果您创建一个 Primefaces 测试复制器,这将帮助我们所有人更好地调试它: github.com/primefaces/primefaces-test
0赞 Melloware 12/3/2022
我还看到你在打电话,有必要吗?model.generateUniqueIds();
0赞 mulivieri 12/5/2022
谢谢。没有错误 - 由以下原因引起:java.lang.NumberFormatException:对于输入字符串:“”......在 org.primefaces.renderkit.MenuItemAwareRenderer.findMenuitem(MenuItemAwareRenderer.java:193) 在 org.primefaces.renderkit.MenuItemAwareRenderer.decode(MenuItemAwareRenderer.java:61) 在 javax.faces.component.UIComponentBase.decode(UIComponentBase.java:478) 在 javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1407) 在 org.primefaces.component.menubutton.MenuButton.processDecodes(MenuButton.java:49)''' 被抛出model.generateUniqueIds();
0赞 mulivieri 12/5/2022
我按照建议使用 github.com/primefaces/primefaces-test 创建了一个简单的菜单按钮测试,但我无法产生相同的错误。因此,我必须假设问题出在此菜单按钮的包装器组件或我的配置中的某个地方(我没有从Primefaces 6.2到Primefaces 8.0更改任何内容)。知道我应该检查什么吗?
0赞 mulivieri 12/5/2022
我位于 SomeBean.someMethod(设置为 DefaultMenuItem 的命令)的调试断点上。在第一次调用时,PF6.2 和 PF8 都到达了 java 代码,但在第二次调用 PF8 时,我无法再执行我的 java 方法。

答: 暂无答案