IBM JSF PortletSession is null
Asked Answered
Y

1

7

We use IBM WebSphere Portal in combination with JSF. A dreadful mix, which keeps proving its dreadfulness time after time.

Recently we're having the issue where we have a portlet with a link to a download servlet (contained in the same war). This servlet tries to read certain attributes from the HttpSession which are supposed to be set by the portlet on the PortletSession in APPLICATION_SCOPE.

Sometimes, however, the servlet couldn't read any of the needed attributes from the HttpSession. This was cause for an investigation by me. After some searching I discovered that it only happened when the portlet was loaded for the first time (without any page reloads).

After some experimenting I got a NullPointerException when calling getAttributeNames(scope) on the PortletSession. The PortletSession was obtained from the external context through the faces context. I discovered the PortletSession was in fact a com.ibm.faces.portlet.httpbridge.PortletSessionWrapper which apparently is supposed to contain the actual PortletSession. This contained session was clearly null. Most methods of the PortletSessionWrapper guard against an NPE with a null check, however, the getAttributeNames(scope) didn't (a bug if you ask me).

Now is the big question: why is the (real) PortletSession null on the first load of the portlet ?

The META-INF of the jsf-protletbrdige providing the wrapper:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: IBM Corporation
Specification-Title: Java Server Faces
Implementation-Title: JSF Widget Library (JWL) - Portlet Bridge
Implementation-Version: JWL v3_1_5
Implementation-Vendor: IBM
Build-Version: 20100212_0941
Build-Date: February 12 2010
Copyright-Info: Copyright (c) 2003,2008, International Business Machines Corporation. All Rights Reserved.

The stacktrace when calling the getAttributeNames(scope) method:

[21-8-12 17:52:16:051 CEST] 00000041 servlet       E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0068E: Uncaught exception created in one of the service methods of the servlet Header in application PA_mytestportlet. Exception created : javax.servlet.ServletException: javax.portlet.PortletException: /MyPortletView.jsp(105,9) '#{MyPortletView.productId}' Error reading 'productId' on type mytest.portal.testportlet.view.MyPortletViewBean
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServlet.doDispatch(PortletServlet.java:361)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServletCollaboratorChainImpl.doCollaborator(PortletServletCollaboratorChainImpl.java:82)
    at com.ibm.isclite.container.collaborator.PortletServletCollaborator.doDispatch(PortletServletCollaborator.java:143)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServletCollaboratorChainImpl.doCollaborator(PortletServletCollaboratorChainImpl.java:74)
    at com.ibm.ws.portletcontainer.rrd.RRDServerPortletServletCollaborator.doDispatch(RRDServerPortletServletCollaborator.java:60)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServletCollaboratorChainImpl.doCollaborator(PortletServletCollaboratorChainImpl.java:74)
    at com.ibm.ws.portletcontainer.cache.CacheCollaborator.doDispatch(CacheCollaborator.java:74)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServletCollaboratorChainImpl.doCollaborator(PortletServletCollaboratorChainImpl.java:74)
    at com.ibm.wps.pe.pc.waspc.core.impl.PortletServletCollaboratorImpl.doDispatch(PortletServletCollaboratorImpl.java:121)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServletCollaboratorChainImpl.doCollaborator(PortletServletCollaboratorChainImpl.java:74)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServlet.dispatch(PortletServlet.java:208)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServlet.service(PortletServlet.java:165)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1597)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:104)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:934)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179)
    at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:121)
    at com.ibm.ws.portletcontainer.webextension.PortletExtensionProcessor.handleRequest(PortletExtensionProcessor.java:86)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:686)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletInvokerImpl.invoke(PortletInvokerImpl.java:214)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletInvokerCollaboratorChainImpl.doCollaborator(PortletInvokerCollaboratorChainImpl.java:78)
    at com.ibm.ws.portletcontainer.cache.PortletInvokerCacheCollaborator.doRender(PortletInvokerCacheCollaborator.java:58)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletInvokerCollaboratorChainImpl.doCollaborator(PortletInvokerCollaboratorChainImpl.java:67)
    at com.ibm.ws.portletcontainer.ext.PortletInvokerPerformanceCollaborator.invoke(PortletInvokerPerformanceCollaborator.java:313)
    at com.ibm.ws.portletcontainer.ext.PortletInvokerPerformanceCollaborator.doInvoke(PortletInvokerPerformanceCollaborator.java:101)
    at com.ibm.ws.portletcontainer.ext.PortletInvokerPerformanceCollaborator.invokePMI(PortletInvokerPerformanceCollaborator.java:163)
    at com.ibm.ws.portletcontainer.ext.PortletInvokerPerformanceCollaborator.doInvoke(PortletInvokerPerformanceCollaborator.java:91)
    at com.ibm.ws.portletcontainer.ext.PortletInvokerPerformanceCollaborator.doRender(PortletInvokerPerformanceCollaborator.java:74)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletInvokerCollaboratorChainImpl.doCollaborator(PortletInvokerCollaboratorChainImpl.java:67)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletInvokerImpl.render(PortletInvokerImpl.java:97)
    at com.ibm.ws.portletcontainer.PortletContainerImpl.doRender(PortletContainerImpl.java:121)
    at com.ibm.ws.portletcontainer.PortletContainerInvokerCollaboratorChainImpl.doCollaborator(PortletContainerInvokerCollaboratorChainImpl.java:80)
    at com.ibm.ws.portletcontainer.ext.ExtCollaborator.doRender(ExtCollaborator.java:74)
    at com.ibm.ws.portletcontainer.PortletContainerInvokerCollaboratorChainImpl.doCollaborator(PortletContainerInvokerCollaboratorChainImpl.java:67)
    at com.ibm.ws.portletcontainer.cache.CacheInvokerCollaborator.doRender(CacheInvokerCollaborator.java:66)
    at com.ibm.ws.portletcontainer.PortletContainerInvokerCollaboratorChainImpl.doCollaborator(PortletContainerInvokerCollaboratorChainImpl.java:67)
    at com.ibm.ws.portletcontainer.PortletContainerImpl.renderPortlet(PortletContainerImpl.java:91)
    at com.ibm.ws.portletcontainer.pcinvoker.PortletInvokerImpl$2.run(PortletInvokerImpl.java:100)
    at java.security.AccessController.doPrivileged(AccessController.java:251)
    at com.ibm.ws.portletcontainer.pcinvoker.PortletInvokerImpl.invokeRender(PortletInvokerImpl.java:96)
    at com.ibm.wps.pe.pc.waspc.core.impl.PortletInvokerImpl$1.invoke(PortletInvokerImpl.java:98)
    at com.ibm.wps.pe.pc.waspc.core.impl.PortletInvokerImpl.invoke(PortletInvokerImpl.java:181)
    at com.ibm.wps.pe.pc.waspc.core.impl.PortletInvokerImpl.invokeRender(PortletInvokerImpl.java:96)
    at com.ibm.wps.pe.pc.waspc.PortletContainerImpl.renderPortlet(PortletContainerImpl.java:116)
    at com.ibm.wps.pe.pc.PortletContainerImpl.doRenderPortlet(PortletContainerImpl.java:641)
    at com.ibm.wps.pe.ext.render.AbstractRenderManager.performService(AbstractRenderManager.java:264)
    at com.ibm.wps.pe.pc.PortletContainerImpl.renderPortlet(PortletContainerImpl.java:132)
    at com.ibm.wps.engine.tags.PortletRenderTag.doStartTag(PortletRenderTag.java:179)
    at com.ibm._jsp._Control._jspx_meth_portal$1skin_portletRender_0(_Control.java:276)
    at com.ibm._jsp._Control._jspx_meth_portal$1logic_if_1(_Control.java:315)
    at com.ibm._jsp._Control._jspService(_Control.java:168)
    at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:99)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179)
    at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:121)
    at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:259)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:686)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.handleRequest(DispatcherServiceImpl.java:93)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.include(DispatcherServiceImpl.java:53)
    at com.ibm.wps.services.dispatcher.Dispatcher.include(Dispatcher.java:50)
    at com.ibm.wps.engine.templates.skins.Default.render(Default.java:154)
    at com.ibm.wps.engine.templates.SkinTemplate.render(SkinTemplate.java:68)
    at com.ibm.wps.composition.elements.Component.render(Component.java:638)
    at com.ibm.wps.composition.elements.Control.render(Control.java:159)
    at com.ibm.wps.composition.Composition.render(Composition.java:3102)
    at com.ibm.wps.composition.Composition.render(Composition.java:163)
    at com.ibm.websphere.personalization.transformation.PznTransformationLayoutModel.render(PznTransformationLayoutModel.java:90)
    at com.ibm.wps.model.wrappers.LayoutModelWrapperFactoryImpl$LayoutModelWrapperImpl.render(LayoutModelWrapperFactoryImpl.java:275)
    at com.ibm.wps.model.ModelUtil$WrappedCompositionModel.render(ModelUtil.java:1124)
    at com.ibm._jsp._UnlayeredContainer_2D_H._jspService(_UnlayeredContainer_2D_H.java:224)
    at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:99)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179)
    at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:121)
    at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:259)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:686)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.handleRequest(DispatcherServiceImpl.java:93)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.include(DispatcherServiceImpl.java:53)
    at com.ibm.wps.services.dispatcher.Dispatcher.include(Dispatcher.java:50)
    at com.ibm.wps.engine.templates.skins.Default.render(Default.java:154)
    at com.ibm.wps.engine.templates.SkinTemplate.render(SkinTemplate.java:68)
    at com.ibm.wps.composition.elements.Component.render(Component.java:638)
    at com.ibm.wps.composition.Composition.render(Composition.java:3102)
    at com.ibm.wps.composition.Composition.render(Composition.java:163)
    at com.ibm.websphere.personalization.transformation.PznTransformationLayoutModel.render(PznTransformationLayoutModel.java:90)
    at com.ibm.wps.model.wrappers.LayoutModelWrapperFactoryImpl$LayoutModelWrapperImpl.render(LayoutModelWrapperFactoryImpl.java:275)
    at com.ibm.wps.model.ModelUtil$WrappedCompositionModel.render(ModelUtil.java:1124)
    at com.ibm._jsp._UnlayeredContainer_2D_V._jspService(_UnlayeredContainer_2D_V.java:215)
    at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:99)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179)
    at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:121)
    at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:259)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:686)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.handleRequest(DispatcherServiceImpl.java:93)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.include(DispatcherServiceImpl.java:53)
    at com.ibm.wps.services.dispatcher.Dispatcher.include(Dispatcher.java:50)
    at com.ibm.wps.engine.templates.skins.Default.render(Default.java:154)
    at com.ibm.wps.engine.templates.SkinTemplate.render(SkinTemplate.java:68)
    at com.ibm.wps.composition.elements.Component.render(Component.java:638)
    at com.ibm.wps.composition.Composition.render(Composition.java:3102)
    at com.ibm.wps.composition.Composition.render(Composition.java:163)
    at com.ibm.websphere.personalization.transformation.PznTransformationLayoutModel.render(PznTransformationLayoutModel.java:90)
    at com.ibm.wps.model.wrappers.LayoutModelWrapperFactoryImpl$LayoutModelWrapperImpl.render(LayoutModelWrapperFactoryImpl.java:275)
    at com.ibm.wps.engine.tags2.PageRenderTag.doStartTag(PageRenderTag.java:534)
    at com.ibm._jsp._Home._jspService(_Home.java:104)
    at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:99)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179)
    at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:121)
    at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:259)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:686)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.handleRequest(DispatcherServiceImpl.java:93)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.include(DispatcherServiceImpl.java:53)
    at com.ibm.wps.services.dispatcher.Dispatcher.include(Dispatcher.java:50)
    at com.ibm.wps.engine.templates.screens.Default.render(Default.java:133)
    at com.ibm.wps.engine.templates.ScreenTemplate.render(ScreenTemplate.java:59)
    at com.ibm.wps.engine.tags2.ScreenRenderTag.doStartTag(ScreenRenderTag.java:182)
    at com.ibm._jsp._Default._jspx_meth_portal$1core_screenRender_0(_Default.java:3623)
    at com.ibm._jsp._Default._jspService(_Default.java:1966)
    at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:99)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:502)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:179)
    at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:121)
    at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:259)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:686)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.handleRequest(DispatcherServiceImpl.java:93)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.include(DispatcherServiceImpl.java:53)
    at com.ibm.wps.services.dispatcher.Dispatcher.include(Dispatcher.java:50)
    at com.ibm.wps.engine.templates.themes.Default.doDispatch(Default.java:294)
    at com.ibm.wps.engine.templates.themes.Default.render(Default.java:247)
    at com.ibm.wps.engine.templates.ThemeTemplate.render(ThemeTemplate.java:65)
    at com.ibm.wps.engine.phases.WPRenderPhase.processRendering(WPRenderPhase.java:509)
    at com.ibm.wps.engine.phases.WPBaseRenderPhase.execute(WPBaseRenderPhase.java:194)
    at com.ibm.wps.state.phases.AbstractRenderPhase.next(AbstractRenderPhase.java:106)
    at com.ibm.wps.engine.phases.WPAbstractRenderPhase.next(WPAbstractRenderPhase.java:97)
    at com.ibm.wps.engine.Servlet.callPortal(Servlet.java:860)
    at com.ibm.wps.engine.Servlet.doGet(Servlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:718)
    at com.ibm.wps.engine.Servlet.doFilter(Servlet.java:1257)
    at com.ibm.wps.resolver.servlet.ContentHandlerCleanup.doFilter(ContentHandlerCleanup.java:648)
    at com.ibm.wps.resolver.servlet.AbstractFilter.doFilter(AbstractFilter.java:93)
    at com.ibm.wps.engine.Servlet.service(Servlet.java:1248)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1597)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:131)
    at com.ibm.wps.engine.ExtendedLocaleFilter.doFilter(ExtendedLocaleFilter.java:113)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
    at com.ibm.wps.resolver.friendly.servlet.FriendlySelectionFilter.doFilter(FriendlySelectionFilter.java:191)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
    at com.ibm.wps.mappingurl.impl.URLAnalyzer.doFilter(URLAnalyzer.java:381)
 . . .
Caused by: javax.portlet.PortletException: /MyPortletView.jsp(105,9) '#{MyPortletView.productId}' Error reading 'productId' on type mytest.portal.testportlet.view.MyPortletViewBean
    at com.ibm.faces.portlet.FacesPortlet.doRender(FacesPortlet.java:384)
    at com.ibm.faces.portlet.FacesPortlet.doView(FacesPortlet.java:413)
    at com.ibm.faces.portlet.FacesPortlet.doDispatch(FacesPortlet.java:301)
    at javax.portlet.GenericPortlet.render(GenericPortlet.java:233)
    at mytest.portal.testportlet.portlet.HeaderPortlet.render(HeaderPortlet.java:44)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletFilterChainImpl.doFilter(PortletFilterChainImpl.java:128)
    at com.ibm.wps.propertybroker.standard.filter.C2APortletFilter.doFilter(C2APortletFilter.java:183)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletFilterChainImpl.doFilter(PortletFilterChainImpl.java:120)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServlet.doDispatch(PortletServlet.java:573)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServletCollaboratorChainImpl.doCollaborator(PortletServletCollaboratorChainImpl.java:114)
    at com.ibm.isclite.container.collaborator.PortletServletCollaborator.doRender(PortletServletCollaborator.java:71)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServletCollaboratorChainImpl.doCollaborator(PortletServletCollaboratorChainImpl.java:105)
    at com.ibm.ws.portletcontainer.rrd.RRDServerPortletServletCollaborator.doRender(RRDServerPortletServletCollaborator.java:123)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServletCollaboratorChainImpl.doCollaborator(PortletServletCollaboratorChainImpl.java:105)
    at com.ibm.ws.portletcontainer.cache.CacheCollaborator.doRender(CacheCollaborator.java:92)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServletCollaboratorChainImpl.doCollaborator(PortletServletCollaboratorChainImpl.java:105)
    at com.ibm.wps.pe.pc.waspc.core.impl.PortletServletCollaboratorImpl.doRender(PortletServletCollaboratorImpl.java:156)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServletCollaboratorChainImpl.doCollaborator(PortletServletCollaboratorChainImpl.java:105)
    at com.ibm.ws.portletcontainer.invoker.impl.PortletServlet.doDispatch(PortletServlet.java:273)
    ... 203 more
Caused by: org.apache.jasper.el.JspELException: /MyPortletView.jsp(105,9) '#{MyPortletView.productId}' Error reading 'productId' on type mytest.portal.testportlet.view.MyPortletViewBean
    at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:106)
    at javax.faces.component.UIParameter.getValue(UIParameter.java:167)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getParamList(HtmlBasicRenderer.java:518)
    at com.sun.faces.renderkit.html_basic.OutputLinkRenderer.renderAsActive(OutputLinkRenderer.java:203)
    at com.sun.faces.renderkit.html_basic.OutputLinkRenderer.encodeBegin(OutputLinkRenderer.java:100)
    at com.ibm.faces.renderkit.DefaultAjaxRenderer.encodeBegin(DefaultAjaxRenderer.java:64)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:812)
    at mytest.jsf.util.ChildRendererUtil.renderChildren(ChildRendererUtil.java:45)
    at mytest.portal.ui.jsf.custom.component.htmltag.HtmlTagRenderer.encodeChildren(HtmlTagRenderer.java:110)
    at com.ibm.faces.renderkit.DefaultAjaxRenderer.encodeChildren(DefaultAjaxRenderer.java:73)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:836)
    at mytest.jsf.util.ChildRendererUtil.renderChildren(ChildRendererUtil.java:47)
    at mytest.portal.ui.jsf.custom.component.htmltag.HtmlTagRenderer.encodeChildren(HtmlTagRenderer.java:110)
    at com.ibm.faces.renderkit.DefaultAjaxRenderer.encodeChildren(DefaultAjaxRenderer.java:73)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:836)
    at mytest.jsf.util.ChildRendererUtil.renderChildren(ChildRendererUtil.java:47)
    at mytest.portal.ui.jsf.custom.component.htmltag.HtmlTagRenderer.encodeChildren(HtmlTagRenderer.java:110)
    at com.ibm.faces.renderkit.DefaultAjaxRenderer.encodeChildren(DefaultAjaxRenderer.java:73)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:836)
    at mytest.jsf.util.ChildRendererUtil.renderChildren(ChildRendererUtil.java:47)
    at mytest.portal.ui.jsf.custom.component.htmltag.HtmlTagRenderer.encodeChildren(HtmlTagRenderer.java:110)
    at com.ibm.faces.renderkit.DefaultAjaxRenderer.encodeChildren(DefaultAjaxRenderer.java:73)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:836)
    at mytest.jsf.util.ChildRendererUtil.renderChildren(ChildRendererUtil.java:47)
    at mytest.portal.ui.jsf.custom.component.htmltag.HtmlTagRenderer.encodeChildren(HtmlTagRenderer.java:110)
    at com.ibm.faces.renderkit.DefaultAjaxRenderer.encodeChildren(DefaultAjaxRenderer.java:73)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:836)
    at mytest.jsf.util.ChildRendererUtil.renderChildren(ChildRendererUtil.java:47)
    at mytest.portal.ui.jsf.custom.component.htmltag.HtmlTagRenderer.encodeChildren(HtmlTagRenderer.java:110)
    at com.ibm.faces.renderkit.DefaultAjaxRenderer.encodeChildren(DefaultAjaxRenderer.java:73)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:836)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:936)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:942)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:148)
    at com.ibm.faces.renderkit.DefaultAjaxRenderer.encodeChildren(DefaultAjaxRenderer.java:73)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:836)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:936)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:942)
    at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:292)
    at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:223)
    at com.ibm.faces.portlet.PortletViewHandlerImpl.renderView(PortletViewHandlerImpl.java:79)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:114)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at com.ibm.faces.portlet.FacesPortlet.doRender(FacesPortlet.java:372)
    ... 221 more
Caused by: java.lang.NullPointerException
    at com.ibm.faces.portlet.httpbridge.PortletSessionWrapper.getAttributeNames(PortletSessionWrapper.java:185)
    at mytest.portal.testportlet.view.MyPortletViewBean.getProductId(MyPortletViewBean.java:394)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:611)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:64)
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:143)
    at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:73)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:102)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:263)
    at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:100)
    ... 265 more

The session scope is obtained using the following code:

FacesContext facesContext = getFacesContext();
if (facesContext != null) {
    return (PortletSession) facesContext.getExternalContext().getSession(createIfNotExist);
 }
 return null;

where createIfNotExist is false.

Yorick answered 22/8, 2012 at 15:20 Comment(4)
What portlet method is in the NPE stack trace? E.g. init, render, etc. You'll be looking for the FacesPortlet unless you've extended it.Dissonance
Added the stacktrace for clarifaction. Seems to occur in the render phase.Yorick
I wasn't able to reproduce this using a 2009 or 2011 build of jsf-portletbridge.jar (though I guess it could have been broken then fixed in the meantime.) What code do you use to get the session from the JSF context?Dissonance
Added the code for obtaining the JSF context.Yorick
D
1

Sounds like a defect in the jsf-portletbridge.jar PortletRequestWrapper type. The JSF reference implementation is written to the servlet spec. The request wrapper implements HttpServletRequest. ExternalContext.getSession(boolean) will invoke HttpServletRequest.getSession(boolean). This will return a decorator object PortletSessionWrapper that implements both HttpSession and PortletSession. It sounds like request decorator returns a session decorator even when the underlying PortletSession is null.

I'd try code of this form:

    PortletRequest request = (PortletRequest) FacesContext.getCurrentInstance()
                                                          .getExternalContext()
                                                          .getRequest();
    PortletSession session = request.getPortletSession(false);
    if (session == null) {
        return null;
    }
    else {
        return session.getAttribute("foo", PortletSession.APPLICATION_SCOPE);
    }
Dissonance answered 29/8, 2012 at 10:16 Comment(4)
As you could see in my question, I noted that that part was probably indeed a bug. The core of my question however was: why IS the portletSession null?Yorick
You stated "createIfNotExist is false". Assuming no other requests create a session before you render the portlet, the session will be null as mandated by the API. JSF will usually create a session to hold the view in, but this doesn't happen until after the render response phase. The bug isn't that the wrapper doesn't do a null check; the external context should return null.Dissonance
Now that comes closer to answering my question as to why the session is null. So it shouldn't get a JSF session until after the render response phase of the JSF. <br/>Yorick
Concerning the bug: when looking at the bridge code, you can clearly see that a lot of the methods of the SessionWrapper take into account that the contained session can be null. So it seems like they thought the contained session could be null and in that sense the bug would be not catching the null object in the getAttributeNumes method. I agree with you that the contained session should never be null and if the session was null, then the sessionwrapper should be null.Yorick

© 2022 - 2024 — McMap. All rights reserved.