NullPointerException when combining SWF 2.4.7, MyFaces Core 2.2.12 and WebSphere 9.0.7 [SWF-1726]
Volker Malzahn opened SWF-1726 and commented
Following NPE occurs when running a webapp based on SWF 2.4.7, MyFaces Core 2.2.12 and WebSphere 9.0.7:
java.lang.NullPointerException
at java.util.Hashtable.get(Hashtable.java:403)
at com.ibm.ws.webcontainer.srt.SRTRequestContext.getSession(SRTRequestContext.java:98)
at com.ibm.ws.webcontainer.srt.SRTServletRequest.getSession(SRTServletRequest.java:1626)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:270)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:270)
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:270)
at org.apache.myfaces.context.servlet.SessionMap._getSession(SessionMap.java:87)
at org.apache.myfaces.context.servlet.SessionMap.getAttribute(SessionMap.java:49)
at org.apache.myfaces.util.AbstractThreadSafeAttributeMap.containsKey(AbstractThreadSafeAttributeMap.java:58)
at org.apache.myfaces.shared.util.SubKeyMap.containsKey(SubKeyMap.java:106)
at org.apache.myfaces.view.ViewScopeProxyMap.containsKey(ViewScopeProxyMap.java:109)
at org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.getValue(ManagedBeanResolver.java:203)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:66)
at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:179)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:80)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
The NPE occurs when a view-state transition is processed without a "to=...", i.e. the same view-state is shown again. Following happens:
- FlowViewHandler.restoreFlowView() reads last ViewRoot instance of last request from flash scope
-
this old
javax.faces.component.UIViewRootinstance contains an instance variable_viewScopewhich references anorg.apache.myfaces.view.ViewScopeProxyMap, which contains inst. variable_delegatewhich holds a reference toorg.apache.myfaces.context.servlet.SessionMapwhich contains a reference to theHttpServletRequestinstance of last request. -
later on this reference to the
HttpServletRequestinstance of last request is used byorg.apache.myfaces.view.ViewScopeProxyMapto check if a certain attribute is stored in JSF's view scope. This callsHttpServletRequestWrapper.getSession()which causes the NPE inside WebSphere's SRTServletRequest/SRTRequestContext classes.
In contrast to simply reusing an old UIViewRoot instance by FlowViewHandler.restoreFlowView() method javax.faces.component.UIViewRoot.restoreState() reinitializes _viewScope with a new instance of ViewScopeProxyMap.
Affects: 2.4.7
1 votes, 3 watchers
Volker Malzahn commented
I don't really understand your question. This issue makes it impossible to use a transition without a "to" attribute (simple <transition on="..."><evaluate.../></transition>) in the combination SWF 2.4, MyFaces 2.2 and WebSphere 9.
Rossen Stoyanchev commented
The question is simply whether some recent change in Web Flow broke what previously used to work?
Rossen Stoyanchev commented
Redirecting in the same state is known to have side effects in JSF. The recommendation is to disable it, see Redirect in Same State.
Volker Malzahn commented
In this situation it's in the reverse way: "redirect in same state" solves the problem for non-AJAX requests. But for AJAX requests a redirect isn't acceptable (the change parts should be updated only). So we need a solution for AJAX requests in the way I have described above.
Rossen Stoyanchev commented
Understood and apologies for the slow response, while I was away. To be completely honest, the JSF integration in Web Flow is quite deep unlike my own expertise with JSF. Unfortunately I have to rely on some help from the community and users like yourself to suggest and try out concrete fixes.
Jürgen Langthaler commented
We hit the same issue using SWF 2.5.1, MyFaces 2.3.2 and Websphere 9.0.0.10. A fix would be very appreciated.