spring-webflow icon indicating copy to clipboard operation
spring-webflow copied to clipboard

NullPointerException when combining SWF 2.4.7, MyFaces Core 2.2.12 and WebSphere 9.0.7 [SWF-1726]

Open spring-operator opened this issue 6 years ago • 7 comments

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 an org.apache.myfaces.view.ViewScopeProxyMap, which contains inst. variable _delegate which holds a reference to org.apache.myfaces.context.servlet.SessionMap which contains a reference to the HttpServletRequest instance of last request.

  • later on this reference to the HttpServletRequest instance of last request is used by org.apache.myfaces.view.ViewScopeProxyMap to check if a certain attribute is stored in JSF's view scope. This calls HttpServletRequestWrapper.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

spring-operator avatar Jun 21 '18 10:06 spring-operator

Rossen Stoyanchev commented

Is this a regression?

spring-operator avatar Jun 25 '18 12:06 spring-operator

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. 

spring-operator avatar Jun 25 '18 12:06 spring-operator

Rossen Stoyanchev commented

The question is simply whether some recent change in Web Flow broke what previously used to work?

spring-operator avatar Jun 25 '18 12:06 spring-operator

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.

spring-operator avatar Aug 17 '18 09:08 spring-operator

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.

spring-operator avatar Aug 20 '18 10:08 spring-operator

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.

spring-operator avatar Sep 12 '18 19:09 spring-operator

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.

spring-operator avatar May 28 '19 12:05 spring-operator