[ https://issues.apache.org/jira/browse/TRINIDAD-2522?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14519543#comment-14519543 ]
Mike Kienenberger commented on TRINIDAD-2522: --------------------------------------------- Would you be willing to create a patch with a solution for this issue? > ThreadLocalResetter in GlobalConfiguratorImpl null in case of shared trinidad > jars > ---------------------------------------------------------------------------------- > > Key: TRINIDAD-2522 > URL: https://issues.apache.org/jira/browse/TRINIDAD-2522 > Project: MyFaces Trinidad > Issue Type: Bug > Components: Components > Affects Versions: 2.1.0-core > Environment: Windows 7, JBoss 7, Java 7 > Reporter: Volker Malzahn > > Issue: when deploying an ear file with trinidad jars in shared lib directory > and 2 (or more) embedded war files which use Trinidad sometimes user gets > following NullPointerException: > 11:24:08,569 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] > (http-/0.0.0.0:1084-7) java.lang.NullPointerException > at org.apache.catalina.connector.Response.toAbsolute(Response.java:1676) > at org.apache.catalina.connector.Response.encodeURL(Response.java:1194) > at > org.apache.catalina.connector.ResponseFacade.encodeURL(ResponseFacade.java:354) > at > javax.servlet.http.HttpServletResponseWrapper.encodeURL(HttpServletResponseWrapper.java:114) > at > org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper.encodeURL(SaveContextOnUpdateOrErrorResponseWrapper.java:114) > at > javax.servlet.http.HttpServletResponseWrapper.encodeURL(HttpServletResponseWrapper.java:114) > at > javax.servlet.http.HttpServletResponseWrapper.encodeURL(HttpServletResponseWrapper.java:114) > at > com.sun.faces.context.ExternalContextImpl.encodeResourceURL(ExternalContextImpl.java:544) > at > org.apache.myfaces.trinidad.util.ExternalContextURLEncoder.encodeResourceURL(ExternalContextURLEncoder.java:69) > at > org.apache.myfaces.trinidadinternal.config.URLEncoderExternalContext.encodeResourceURL(URLEncoderExternalContext.java:102) > at > javax.faces.context.ExternalContextWrapper.encodeResourceURL(ExternalContextWrapper.java:132) > at > javax.faces.context.ExternalContextWrapper.encodeResourceURL(ExternalContextWrapper.java:132) > at > javax.faces.context.ExternalContextWrapper.encodeResourceURL(ExternalContextWrapper.java:132) > at > org.apache.myfaces.trinidad.render.CoreRenderer.renderEncodedResourceURI(CoreRenderer.java:1103) > at > org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.StyleSheetRenderer.encodeAll(StyleSheetRenderer.java:128) > at > org.apache.myfaces.trinidad.render.CoreRenderer.delegateRenderer(CoreRenderer.java:679) > at > org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.HeadRenderer.encodeEnd(HeadRenderer.java:97) > at > org.apache.myfaces.trinidad.render.CoreRenderer.encodeEnd(CoreRenderer.java:538) > at > org.apache.myfaces.trinidad.component.UIXComponentBase.encodeEnd(UIXComponentBase.java:1210) > at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1826) > Reason for this NPE: > URLEncoderFactory has static variable _local which stores a thread local > which points to URLEncoder to be used. If that thread local isn't cleared at > the end of a request an old URLEncoder (more concrete an old > ExternalContextURLEncoder) may be used at one of the next requests which has > a reference to an old ExternalContext which causes the NPE in > ((HttpServletResponse) response).encodeURL(url). > Trinidad has ThreadLocalResetter in GlobalConfiguratorImpl (stored in > _threadResetter) which has responsibility to clean up thread locals at the > end of each request. But _threadResetter could be null in scenario "ear file > with trinidad jars in shared lib directory and 2 (or more) embedded war files > which use Trinidad". > Reason: > - GlobalConfiguratorImpl has static map _CONFIGURATORS which is filled > in GlobalConfiguratorImpl.getInstance(), key is > Thread.currentThread().getContextClassLoader(). I.e. we have multiple > GlobalConfiguratorImpl instances if we have multiple ContextClassLoaders. > - GlobalConfiguratorImpl ._threadResetter is initialized in > GlobalConfiguratorImpl.__setThreadLocalResetter() which is called by > ThreadLocalResetter.init() which is called by static method > ThreadLocalUtils._getThreadLocalManager(String) which stores result in its > static map _threadLocalManagers (independently of current ContextClassLoader). -- This message was sent by Atlassian JIRA (v6.3.4#6332)