I got following issue.
jboss-portal-2.7.0.GA (bundled version) -> JSF RI 1.2_08 and Jboss portlet bridge 1.0.0.B4
I have PortletA and PortletB - both are JSF portlets. PortletA publishes Event and PortletB processes it. Sometimes when event is triggered from PortletA, ViewExpiredException is thrown during restoring view of PortletB
Caused by: javax.faces.application.ViewExpiredException: viewId:/scsearch/scsearchdetail.jsp - View /scsearch/scsearchdetail.jsp could not be restored. at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:186) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:104) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at org.jboss.portletbridge.AjaxPortletBridge.execute(AjaxPortletBridge.java:587) at org.jboss.portletbridge.AjaxPortletBridge.renderResponse(AjaxPortletBridge.java:441) at org.jboss.portletbridge.AjaxPortletBridge.doFacesRequest(AjaxPortletBridge.java:344)
As workaround this partly works (at least stack trace is not displayed though event is not processed) - add it to web.xml of PortletB's war
<context-param> <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name> <param-value>true</param-value>
Still not satisfied with "solution" I debug JSF and came to strange conclusion: JSF adds hidden field into form (there is form in both PortletA and PortletB underlying jsp page) like
<INPUT id="javax.faces.ViewState" type="hidden" name="javax.faces.ViewState" value="j_id9" /> w </context-param>
This values stores version of view stored in session for particular view. Problem is that the same version is used for both portlets - in case that PortletB does have such a version (e.g. html would like like)
<INPUT id="javax.faces.ViewState" type="hidden" name="javax.faces.ViewState" value="j_id8" /> w </context-param>
than no view is found and ViewExpiredException is thrown.
Any idea how to solve this properly?