[ 
https://issues.apache.org/jira/browse/MYFACES-1531?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12476904
 ] 

David Moss commented on MYFACES-1531:
-------------------------------------

FWIW - I had exactly this problem, until I realised that I hadn't included

<listener>
    
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>

in my web.xml

> Incorrect handling of FacesContext
> ----------------------------------
>
>                 Key: MYFACES-1531
>                 URL: https://issues.apache.org/jira/browse/MYFACES-1531
>             Project: MyFaces Core
>          Issue Type: Bug
>    Affects Versions: 1.1.4
>         Environment: WindowsXP & Solaris; Tomcat 5.5.17, Liferay 4.2.0 
> (Portal Server)
>            Reporter: Olaf Fricke
>
> We encountered some NPE when accessing the FacesContext in the doView-Method. 
> I first thought about a bug in the Liferay-Portal-Server (see 
> http://support.liferay.com/browse/LEP-1869). But then I discovered that it is 
> a bug in MyFaces, that is triggred because Liferay pools ActionRequest and 
> RenderRequest objects.
> MyFaces changes the external context value in the method 
> org.apache.myfaces.portlet.MyFacesGenericPortlet#facesRender to switch from 
> ActionRequest and ActionResponse to RenderRequest and RenderResponse. But 
> that switch happens to late, so that in doView (and doEdit and doHelp as 
> well) the FacesContext uses references to the ActionRequest and 
> ActionResponse instead of RenderRequest and RenderResponse. And unfortunately 
> Liferay has already recycled the RenderRequest object and thus a NPE is 
> raised when trying to use the request.
> I added the following code to my portlet (indeed, to our own super class) to 
> make the switch earlier and the NullPointerException when accessing 
> attributes via the FacesContext will not be raised any longer. (Please note 
> that I cannot use the FacesContext.getCurrentInstance() method in a portal 
> environment, because each portlet owns its own context).
>     public void render(RenderRequest request, RenderResponse response) throws 
> PortletException,
>             IOException {
>         // The following code was taken from 
> org.apache.myfaces.portlet.MyFacesGenericPortlet#facesRender
>         //
>         // get the portlet session local context
>         ServletFacesContextImpl context = (ServletFacesContextImpl) 
> request.getPortletSession()
>                 .getAttribute(CURRENT_FACES_CONTEXT);
>         if (context != null) {
>             // and set a new external context that uses the render request 
> and response
>             context.setExternalContext(makeExternalContext(request, 
> response));
>         } else {
>             // no context available for the current portlet yet; create a new 
> one and put it into the session
>             context = (ServletFacesContextImpl) facesContext(request, 
> response);
>             request.getPortletSession().setAttribute(CURRENT_FACES_CONTEXT, 
> context);
>         }
>         super.render(request, response);
>     } 
> Later I discovered another problem concerning the FacesContext: When 
> rendering the very first MyFaces-Portlet, no FacesContext exists for the 
> Portlet. Therefore the method nonFacesRequest is called. Somewhere inside 
> this method a new FacesContext is created, but that new FacesContext is never 
> put into the session. Thus my workaround in the render method was broken 
> again. I fixed that by extending the method nonFacesRequest as follows:
>     protected void nonFacesRequest(RenderRequest request, RenderResponse 
> response)
>             throws PortletException {
>         super.nonFacesRequest(request, response);
>         request.getPortletSession().setAttribute(CURRENT_FACES_CONTEXT,
>                 FacesContext.getCurrentInstance());
>     }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to