spring-projects / spring-webflow

Spring Web Flow
https://spring.io/projects/spring-webflow
Apache License 2.0
324 stars 229 forks source link

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

Open spring-operator opened 6 years ago

spring-operator commented 6 years ago

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

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 commented 6 years ago

Rossen Stoyanchev commented

Is this a regression?

spring-operator commented 6 years ago

Volker Malzahn commented

I don't really understand your question. This issue makes it impossible to use a transition without a "to" attribute (simple \\) in the combination SWF 2.4, MyFaces 2.2 and WebSphere 9. 

spring-operator commented 6 years ago

Rossen Stoyanchev commented

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

spring-operator commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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 commented 5 years ago

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.