Details
Description
I am running an application in Geronimo 2.1.7 that requires valid scope and it fails with the following exception
Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: unknown scope defined: null
at
org.apache.myfaces.el.VariableResolverImpl.resolveVariable(VariableResol
verImpl.java:71)
at
org.apache.myfaces.el.convert.VariableResolverToELResolver.getValue(Vari
ableResolverToELResolver.java:93)
at
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
---------------
---------------
Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
at
org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.access$3
01(FacesCompositeELResolver.java:46)
at
org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver$4.invoke
(FacesCompositeELResolver.java:108)
at
org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.invoke(F
acesCompositeELResolver.java:148)
at
org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue
(FacesCompositeELResolver.java:104)
at
javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
After investigating on codebase i see that the following is the code snippet where one thread sets the scope and some other thread on the same context unsets scope to null before a call made to org.apache.myfaces.el.VariableResolverImpl.resolveVariable and it leads the above exception
try
{ setScope(requestMap); super.setValue(context, base, property, val); }finally
{ unsetScope(requestMap); }So to fix the scope i have changed the following code snippet in the FacesCompositeELResolver to put back previous scope value
try
{ tmpScope = getScope(requestMap); setScope(requestMap); super.setValue(context, base, property, val); } finally
{
if( tmpScope != null)
else
{ unsetScope(requestMap); }}
I am attaching the code with all the changes to fix this issue.Please review and provide your comments.