在ui下使用时,Primefaces commandButton不调用支持bean:include

时间:2017-08-23 21:09:52

标签: jsf primefaces jsf-2

我有一个JSF模板,它动态地包含用户通过菜单选择后显示的内容:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    template="/WEB-INF/templates/template.xhtml">

    <ui:define name="main">
        <p:panel id="content">
            <ui:include src="#{navigationMb.page}" />
        </p:panel>
    </ui:define>

</ui:composition>

我想要包含的其中一个页面有一个p:commandButton,如下所示:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">

    <div class="ui-fluid">
        <h:form>
            <p:panelGrid 
                    id="changePasswordPanel" 
                    layout="grid" 
                    columns="2"
                    styleClass="ui-panelgrid-blank">

                ...

                <p:commandButton value="Change Password"
                    action="#{changePasswordMb.changePassword}" 
                    update="changePasswordPanel"
                    icon="ui-icon-check" />
            </p:panelGrid>
        </h:form>
    </div>

</ui:composition>

我应该在我的支持bean中调用以下方法:

package com.bgasparotto.archproject.web.security;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.slf4j.Logger;

@Named
@RequestScoped
public class ChangePasswordMb {

    @Inject 
    private Logger logger;

    public void changePassword() {
        logger.info("TESTE");
    }
}

但是,我的changePassword方法永远不会被调用。 此外,如果我只是将我所包含页面的内容直接放入我的主页面,它就可以工作:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    template="/WEB-INF/templates/template.xhtml">

    <ui:define name="main">
        <p:panel id="content">
            <div class="ui-fluid">
                <h:form>
                    <p:panelGrid 
                            id="changePasswordPanel" 
                            layout="grid" 
                            columns="2"
                            styleClass="ui-panelgrid-blank">

                        ...

                        <p:commandButton value="Change Password"
                            action="#{changePasswordMb.changePassword}" 
                            update="changePasswordPanel"
                            icon="ui-icon-check" />
                    </p:panelGrid>
                </h:form>
            </div>
        </p:panel>
    </ui:define>

</ui:composition>

围绕StackOverflow,我发现BalusC发现了这个great guide来调试我的应用程序。我已经检查过每一个可能的原因,但它没有起作用。 另外,我尝试在我的模板中加入OmniFaces fixviewstate.js,但它也没有用:

<h:body>
    <h:outputScript library="omnifaces" name="fixviewstate.js" target="head" />
    ...
<h:body>

编辑1 以下是我NavigationMb的代码:

package com.bgasparotto.archproject.web;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.slf4j.Logger;

@Named
@RequestScoped
public class NavigationMb { 
    private String page;

    public NavigationMb() {
        this("welcome.xhtml");
    }

    public NavigationMb(String page) {
        this.page = page;
    }

    public void nav(String page) {
        this.page = page;
    }

    public String getPage() {
        return page;
    }

    public void setPage(String page) {
        this.page = page;
    }
}

我已经没有可能的解决方案了。有什么想法吗?

我的设置:

  • Java 8
  • Wildfly 10.1.0.Final(Java EE 7)
  • (JSF 2.2,Mojarra 2.2.13 SP1)
  • Primefaces 6.1
  • OmniFaces 2.6.4
  • CDI with Weld 2.3.5

提前致谢。

0 个答案:

没有答案