Faces message stops working after page navigation

133 views Asked by At

I have a problem with faces message rendering in portlet, deployed on HCL portal 9.5, which is on top of Websphere Application Server 9.0.5.7. Portlet has two pages and when I made first page navigation, faces message stops rendering.

First page html:

<div xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:portlet="http://java.sun.com/portlet_2_0"
xmlns:p="http://primefaces.org/ui">

<f:view>
    <f:metadata>
        <f:event listener="#{pc_TestJSF22View.init}" type="preRenderView"></f:event>
    </f:metadata>
    <h:head>
        <h:outputScript library="primefaces" name="jquery/jquery.js" />
    </h:head>
    <h:body>
        <h:form id="formMain" styleClass="form">
            <p:commandButton id="btnTest" value="Test"
                action="#{pc_TestJSF22View.doBtnTest}" />
            <p:commandButton id="btnSecondPage" value="Second page"
                action="#{pc_TestJSF22View.doBtnSecondPage}" ajax="false" />

            <p:messages id="msgGlobal" globalOnly="true" showIcon="false">
                <p:autoUpdate />
            </p:messages>
        </h:form>
    </h:body>
</f:view>

First page request bean:

public class TestJSF22View extends PageCodeBase {

private TestSess testSess;

public void init() {
    if (PrimeFaces.current().isAjaxRequest()) {
        return;
    }

    try {
        System.out.println("INIT method");
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

// button action
 public String doBtnSecondPage() {
     return "testView2";
 }

public String doBtnTest() {
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("page 1 msg updated"));
    return null;
}

protected TestSess getTestSess() {
    if (testSess == null) {
        testSess = (TestSess) getManagedBean("testSess");
    }
    return testSess;
}

}

Second page html:

<div xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:portlet="http://java.sun.com/portlet_2_0"
xmlns:p="http://primefaces.org/ui">

<f:view>
    <f:metadata>
        <f:event listener="#{pc_TestJSF22View2.init}" type="preRenderView"></f:event>
    </f:metadata>
    <h:head>
        <h:outputScript library="primefaces" name="jquery/jquery.js" />
    </h:head>
    <h:body>
        <h:form id="formMain" styleClass="form">
            <p:commandButton id="btnFirstPage" value="First page"
                action="#{pc_TestJSF22View2.doBtnFirstPage}" ajax="false" />

            <p:commandButton id="btnMsg" value="Show message"
                action="#{pc_TestJSF22View2.doBtnMsg}" />

            <p:messages id="msgGlobal2" globalOnly="true" showIcon="false">
                <p:autoUpdate />
            </p:messages>
        </h:form>
    </h:body>
</f:view>

Second page request bean:

public class TestJSF22View2 extends PageCodeBase {
private TestSess2 testSess2;

public void init() {
    if (PrimeFaces.current().isAjaxRequest()) {
        return;
    }

    try {
        System.out.println("INIT2 method");
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

// button action

public String doBtnFirstPage() {
    System.out.println("doBtnFirstPage method");
    return "testView";
}

public String doBtnMsg() {
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("page 2 msg updated"));
    return null;
}

protected TestSess2 getTestSess2() {
    if (testSess2 == null) {
        testSess2 = (TestSess2) getManagedBean("testSess2");
    }
    return testSess2;
}

}

faces-config :

    <?xml version='1.0' encoding='UTF-8'?>

<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
    version="2.2">
    <application>
        <view-handler>com.ibm.faces20.portlet.FaceletPortletViewHandler</view-handler>
        <el-resolver>com.ibm.faces20.portlet.PortletELResolver</el-resolver>
        <resource-handler>com.ibm.faces20.portlet.httpbridge.PortletResourceHandler</resource-handler>
    </application>
    <factory>
        <exception-handler-factory>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerFactory</exception-handler-factory>
    </factory>
    <component>
        <component-type>com.ibm.faces20.portlet.component.PortletActionURL</component-type>
        <component-class>com.ibm.faces20.portlet.component.PortletActionURL</component-class>
    </component>
    <component>
        <component-type>com.ibm.faces20.portlet.component.PortletResourceURL</component-type>
        <component-class>com.ibm.faces20.portlet.component.PortletResourceURL</component-class>
    </component>
    <component>
        <component-type>com.ibm.faces20.portlet.component.PortletRenderURL</component-type>
        <component-class>com.ibm.faces20.portlet.component.PortletRenderURL</component-class>
    </component>
    <component>
        <component-type>com.ibm.faces20.portlet.component.PortletParam</component-type>
        <component-class>com.ibm.faces20.portlet.component.PortletParam</component-class>
    </component>
    <component>
        <component-type>com.ibm.faces20.portlet.component.PortletProperty</component-type>
        <component-class>com.ibm.faces20.portlet.component.PortletProperty</component-class>
    </component>
    <component>
        <component-type>com.ibm.faces20.portlet.component.PortletNameSpace</component-type>
        <component-class>com.ibm.faces20.portlet.component.PortletNameSpace</component-class>
    </component>
    <managed-bean>
        <managed-bean-name>pc_TestJSF22View</managed-bean-name>
        <managed-bean-class>pagecode.TestJSF22View</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>testSess</managed-bean-name>
        <managed-bean-class>beans.TestSess</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>pc_TestJSF22View2</managed-bean-name>
        <managed-bean-class>pagecode.TestJSF22View2</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>testSess2</managed-bean-name>
        <managed-bean-class>beans.TestSess2</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    <render-kit>
        <renderer>
            <component-family>javax.faces.Output</component-family>
            <renderer-type>com.ibm.faces20.portlet.tag.render.ActionURLTagRender</renderer-type>
            <renderer-class>com.ibm.faces20.portlet.tag.render.ActionURLTagRender</renderer-class>
        </renderer>
    </render-kit>
    <render-kit>
        <renderer>
            <component-family>javax.faces.Output</component-family>
            <renderer-type>com.ibm.faces20.portlet.tag.render.ResourceURLTagRender</renderer-type>
            <renderer-class>com.ibm.faces20.portlet.tag.render.ResourceURLTagRender</renderer-class>
        </renderer>
    </render-kit>
    <render-kit>
        <renderer>
            <component-family>javax.faces.Output</component-family>
            <renderer-type>com.ibm.faces20.portlet.tag.render.RenderURLTagRender</renderer-type>
            <renderer-class>com.ibm.faces20.portlet.tag.render.RenderURLTagRender</renderer-class>
        </renderer>
    </render-kit>
    <render-kit>
        <renderer>
            <component-family>javax.faces.Output</component-family>
            <renderer-type>com.ibm.faces20.portlet.tag.render.PortletNameSpaceTagRender</renderer-type>
            <renderer-class>com.ibm.faces20.portlet.tag.render.PortletNameSpaceTagRender</renderer-class>
        </renderer>
    </render-kit>
    <navigation-rule>
        <from-view-id>/*</from-view-id>
        <navigation-case>
            <from-outcome>testView</from-outcome>
            <to-view-id>/TestJSF22View.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
    <navigation-rule>
        <from-view-id>/*</from-view-id>
        <navigation-case>
            <from-outcome>testView2</from-outcome>
            <to-view-id>/TestJSF22View2.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
</faces-config>

So, if I illustrate my problem: When I first open portlet and first page is displayed, I click "Test" button, that displays faces message. Next, I navigate to second page and I click "Show message" button, which should display another message on second page, but it doesn't. I get the following warning:

There are some unhandled FacesMessages, this means not every FacesMessage had a chance to be rendered.
These unhandled FacesMessages are: 
- page 2 msg updated

Even if I go back to the first page again and hit "Test" button one more time, message is not displayed and the same warning is what I get.

I never had problems with faces messages when I deployed portlets on IBM Websphere Portal Server 7 with JSF 2.0, but now when I run it on HCL portal 9.5 (JSF 2.2), I noticed this strange behavior.

Did I miss something while migrating to HCL portal?

Primefaces version is 7.0, p:messages usage seems ok to me. Could HCL portlet bridge cause that problem? Does anyone have experience with deploying JSF portlets on HCL Portal?

EDIT1: I've just tried to deploy web application with identical code on Websphere Application Server 9 and it works like a charm. Based on that I believe there's some problem with HCL Portal.

0

There are 0 answers