[ 
https://issues.apache.org/jira/browse/CXF-8603?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17426231#comment-17426231
 ] 

Freeman Yue Fang commented on CXF-8603:
---------------------------------------

Hi [~punched_card],

Sorry, I mean add NPE guard before call into 
org.apache.cxf.common.classloader.ClassLoaderUtils.

Something like
{code}
--- a/core/src/main/java/org/apache/cxf/helpers/XPathUtils.java
+++ b/core/src/main/java/org/apache/cxf/helpers/XPathUtils.java
@@ -69,8 +69,10 @@ public class XPathUtils {
     }
 
     public Object getValue(String xpathExpression, Node node, QName type) {
-        ClassLoaderHolder loader
-            = 
ClassLoaderUtils.setThreadContextClassloader(getClassLoader(xpath.getClass()));
+        ClassLoaderHolder loader = null;
+        if (getClassLoader(xpath.getClass()) != null) {
+            loader = 
ClassLoaderUtils.setThreadContextClassloader(getClassLoader(xpath.getClass()));
+        }
         try {
             return xpath.evaluate(xpathExpression, node, type);
         } catch (Exception e) {
{code}

This similar pattern is also used in several other places inside CXF code base.

Best Regards
Freeman


> ClassLoaderUtils.setThreadContextClassloader attempts to set null class loader
> ------------------------------------------------------------------------------
>
>                 Key: CXF-8603
>                 URL: https://issues.apache.org/jira/browse/CXF-8603
>             Project: CXF
>          Issue Type: Bug
>    Affects Versions: 3.3.11
>            Reporter: Archie Patrick
>            Priority: Major
>
> Created a custom connector for a SOAP Service using CXF for Oracle Identity 
> Manager using their Identity Connector Framework (ICF).  Their framework has 
> a Context Class Loader "watcher" that detects  that the 
> ClassLoaderUtils.setThreadContextClassLoader() method is attempting to set a 
> "null" loader.  This happens when a call is made to invoke a SOAP message:
>     public void testService() {
>         try {
>             IPersonnelManagement2014 port = getPersonnelManagementPort2014();
>             PersonnelManagementViewUser2Response response = 
> port.viewUser("xxxxx", "external", null, null, null, null);
>  
> See stacktrace below:
> SEVERE: Attempting to set the CCL of thread 'pool-1-thread-9' to nullSEVERE: 
> Attempting to set the CCL of thread 'pool-1-thread-9' to 
> nulljava.lang.Throwable at 
> org.identityconnectors.framework.server.impl.CCLWatchThread.setContextClassLoader(CCLWatchThread.java:59)
>  at 
> org.apache.cxf.common.classloader.ClassLoaderUtils.setThreadContextClassloader(ClassLoaderUtils.java:70)
>  at org.apache.cxf.helpers.XPathUtils.getValue(XPathUtils.java:73) at 
> org.apache.cxf.interceptor.ClientFaultConverter.setStackTrace(ClientFaultConverter.java:245)
>  at 
> org.apache.cxf.interceptor.ClientFaultConverter.handleMessage(ClientFaultConverter.java:84)
>  at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
>  at 
> org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:112)
>  at 
> org.apache.cxf.jaxws.handler.soap.SOAPHandlerInterceptor.handleMessage(SOAPHandlerInterceptor.java:137)
>  at 
> org.apache.cxf.jaxws.handler.soap.SOAPHandlerInterceptor.handleMessage(SOAPHandlerInterceptor.java:70)
>  at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
>  at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:829) at 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1696)
>  at 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1570)
>  at 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1371)
>  at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) 
> at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:671) at 
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63)
>  at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
>  at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530) at 
> org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:441) at 
> org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:356) at 
> org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:314) at 
> org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96) at 
> org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140) at 
> com.sun.proxy.$Proxy40.viewUser(Unknown Source) at 
> com.icsynergy.epic.wsclient.WSClient.testService(WSClient.java:550)
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to