spring-webflow
spring-webflow copied to clipboard
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.UIViewRoot
instance contains an instance variable_viewScope
which references anorg.apache.myfaces.view.ViewScopeProxyMap
, which contains inst. variable_delegate
which holds a reference toorg.apache.myfaces.context.servlet.SessionMap
which contains a reference to theHttpServletRequest
instance of last request. -
later on this reference to the
HttpServletRequest
instance of last request is used byorg.apache.myfaces.view.ViewScopeProxyMap
to 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.