Details
Description
Note: This issue is also being tracked at the Liferay issue tracker under [FACES-2867|https://issues.liferay.com/browse/FACES-2867].
h3. Problem Description:
The BridgeSetup.java and BridgeFormsSetup.java classes assume that the "org.icefaces.impl.event::ViewState" attribute will always be be non-null. Because of this assumption, NullPointerException is being thrown in a portlet environment during a portlet mode change. This is because of a requirement in JSR 329/378 that prevents "non excluded" request attributes from surviving from the ACTION_PHASE of the portlet lifecycle into the RENDER_PHASE of the portlet lifecycle during a portlet mode change. This functionality is implemented in Liferay Faces Bridge with the following code:
{code:java|title=BridgeRequestScopeImpl.java}
if (!portletMode.equals(portletRequest.getPortletMode())) {
setPortletModeChanged(true);
restoreNonExcludedRequestAttributes = false;
}
{code}
h3. Steps to Reproduce:
1. Download and extract the [Pluto 3.0.0 Tomcat bundle|https://portals.apache.org/pluto/download.html].
2. Download the [Mojarra 2.3.0-m10 all-in-one jar|http://search.maven.org/remotecontent?filepath=org/glassfish/javax.faces/2.3.0-m10/javax.faces-2.3.0-m10.jar]:
{code:xml}
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.3.0-m10</version>
</dependency
{code}
3. Extract the jar:
{noformat}jar xf javax.faces-2.3.0-m10.jar{noformat}
4. Remove the following file:
{noformat}rm META-INF/services/javax.servlet.ServletContainerInitializer{noformat}
5. Re-zip the jar:
jar cmf META-INF/MANIFEST.MF javax.faces-2.3.0-m10-fixed.jar META-INF/ com/ javax/
6. Copy the jar to Pluto's tomcat/lib folder
7. Copy the icefaces-applicant-portlet (attached) war to Pluto's tomcat/webapps folder
Note: The icefaces-applicant-portlet demo is part of the Liferay Faces suite of demo portlets. Its purpose is to exercise several typical use-cases of ICEfaces in a portlet environment.
8. Start Pluto's Tomcat
9. Visit the following URL:
http://localhost:8080/pluto/portal
10. Using the Pluto Admin page, create a new page named "icefaces" and add the portlet named "1" from the com.liferay.faces.demo.icefaces.applicant.portlet module.
11. Visit the following URL:
http://localhost:8080/pluto/portal/icefaces
12. Click on the "Edit" link under the "Liferay" logo in the upper right hand corner.
13. Click the Submit button
(/) Expected Results
The portletViewMode.xhtml view is rendered correctly.
(x) Actual Results
{noformat}
java.lang.NullPointerException
at org.icefaces.impl.event.BridgeSetup.getBodyResources(BridgeSetup.java:205)
at org.icefaces.impl.event.BridgeSetup.processEvent(BridgeSetup.java:99)
at javax.faces.event.SystemEvent.processListener(SystemEvent.java:147)
at javax.faces.event.ComponentSystemEvent.processListener(ComponentSystemEvent.java:134)
at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2256)
at com.sun.faces.application.ApplicationImpl.invokeListenersFor(ApplicationImpl.java:2229)
at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:313)
at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:257)
at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:746)
at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:746)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:884)
at javax.faces.component.UIViewRoot.encodeBegin(UIViewRoot.java:1090)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:491)
at javax.faces.view.ViewDeclarationLanguageWrapper.renderView(ViewDeclarationLanguageWrapper.java:126)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:194)
at com.liferay.faces.bridge.application.internal.ViewHandlerCompatImpl.renderView(ViewHandlerCompatImpl.java:95)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:126)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:223)
at com.liferay.faces.bridge.internal.BridgePhaseHeaderRenderCommon.executeRender(BridgePhaseHeaderRenderCommon.java:191)
at com.liferay.faces.bridge.internal.BridgePhaseHeaderImpl.execute(BridgePhaseHeaderImpl.java:67)
at com.liferay.faces.bridge.internal.BridgeCompatImpl.doFacesRequest(BridgeCompatImpl.java:52)
at javax.portlet.faces.GenericFacesPortlet.renderHeaders(GenericFacesPortlet.java:535)
{noformat}
h3. Problem Description:
The BridgeSetup.java and BridgeFormsSetup.java classes assume that the "org.icefaces.impl.event::ViewState" attribute will always be be non-null. Because of this assumption, NullPointerException is being thrown in a portlet environment during a portlet mode change. This is because of a requirement in JSR 329/378 that prevents "non excluded" request attributes from surviving from the ACTION_PHASE of the portlet lifecycle into the RENDER_PHASE of the portlet lifecycle during a portlet mode change. This functionality is implemented in Liferay Faces Bridge with the following code:
{code:java|title=BridgeRequestScopeImpl.java}
if (!portletMode.equals(portletRequest.getPortletMode())) {
setPortletModeChanged(true);
restoreNonExcludedRequestAttributes = false;
}
{code}
h3. Steps to Reproduce:
1. Download and extract the [Pluto 3.0.0 Tomcat bundle|https://portals.apache.org/pluto/download.html].
2. Download the [Mojarra 2.3.0-m10 all-in-one jar|http://search.maven.org/remotecontent?filepath=org/glassfish/javax.faces/2.3.0-m10/javax.faces-2.3.0-m10.jar]:
{code:xml}
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.3.0-m10</version>
</dependency
{code}
3. Extract the jar:
{noformat}jar xf javax.faces-2.3.0-m10.jar{noformat}
4. Remove the following file:
{noformat}rm META-INF/services/javax.servlet.ServletContainerInitializer{noformat}
5. Re-zip the jar:
jar cmf META-INF/MANIFEST.MF javax.faces-2.3.0-m10-fixed.jar META-INF/ com/ javax/
6. Copy the jar to Pluto's tomcat/lib folder
7. Copy the icefaces-applicant-portlet (attached) war to Pluto's tomcat/webapps folder
Note: The icefaces-applicant-portlet demo is part of the Liferay Faces suite of demo portlets. Its purpose is to exercise several typical use-cases of ICEfaces in a portlet environment.
8. Start Pluto's Tomcat
9. Visit the following URL:
http://localhost:8080/pluto/portal
10. Using the Pluto Admin page, create a new page named "icefaces" and add the portlet named "1" from the com.liferay.faces.demo.icefaces.applicant.portlet module.
11. Visit the following URL:
http://localhost:8080/pluto/portal/icefaces
12. Click on the "Edit" link under the "Liferay" logo in the upper right hand corner.
13. Click the Submit button
(/) Expected Results
The portletViewMode.xhtml view is rendered correctly.
(x) Actual Results
{noformat}
java.lang.NullPointerException
at org.icefaces.impl.event.BridgeSetup.getBodyResources(BridgeSetup.java:205)
at org.icefaces.impl.event.BridgeSetup.processEvent(BridgeSetup.java:99)
at javax.faces.event.SystemEvent.processListener(SystemEvent.java:147)
at javax.faces.event.ComponentSystemEvent.processListener(ComponentSystemEvent.java:134)
at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2256)
at com.sun.faces.application.ApplicationImpl.invokeListenersFor(ApplicationImpl.java:2229)
at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:313)
at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:257)
at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:746)
at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:746)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:884)
at javax.faces.component.UIViewRoot.encodeBegin(UIViewRoot.java:1090)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:491)
at javax.faces.view.ViewDeclarationLanguageWrapper.renderView(ViewDeclarationLanguageWrapper.java:126)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:194)
at com.liferay.faces.bridge.application.internal.ViewHandlerCompatImpl.renderView(ViewHandlerCompatImpl.java:95)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:126)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:223)
at com.liferay.faces.bridge.internal.BridgePhaseHeaderRenderCommon.executeRender(BridgePhaseHeaderRenderCommon.java:191)
at com.liferay.faces.bridge.internal.BridgePhaseHeaderImpl.execute(BridgePhaseHeaderImpl.java:67)
at com.liferay.faces.bridge.internal.BridgeCompatImpl.doFacesRequest(BridgeCompatImpl.java:52)
at javax.portlet.faces.GenericFacesPortlet.renderHeaders(GenericFacesPortlet.java:535)
{noformat}
Hi,
I have the same exception. I use JSF 2.3 (apache MyFaces), IceFaces(ICEfaces 4.2.0,Build number: 6,Build date: 170309,Revision: 51154), Spring 4.3.9, Spring Web Flow and Tomcat 8.
The exception happens when Spring Web Flow transits from First (very very simple) page to Second (very very simple) page.
Could you explain why is this exception and is there any workaround or I have to wait for IceFaces 4.3?
Thank you.