You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by Rajkumar Kothapa <Ra...@pramati.com> on 2006/07/05 09:42:51 UTC

NullPointerException in XMLUtil class of Axis

Hi,

I am using Axis 1.4 and jvm version "build 1.4.2_07-b05, mixed mode" and i 
am getting the following exception under heavy loads.

java.lang.NullPointerException
 at 
java.lang.ThreadLocal$ThreadLocalMap$Entry.access$502(ThreadLocal.java:229)
 at 
java.lang.ThreadLocal$ThreadLocalMap.replaceStaleEntry(ThreadLocal.java:509)
 at java.lang.ThreadLocal$ThreadLocalMap.getAfterMiss(ThreadLocal.java:362)
 at java.lang.ThreadLocal$ThreadLocalMap.get(ThreadLocal.java:341)
 at java.lang.ThreadLocal$ThreadLocalMap.access$000(ThreadLocal.java:219)
 at java.lang.ThreadLocal.get(ThreadLocal.java:121)
 at org.apache.axis.utils.XMLUtils.getDocumentBuilder(XMLUtils.java:237)
 at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:337)
 at 
org.apache.axis.message.SOAPDocumentImpl.<init>(SOAPDocumentImpl.java:70)
 at org.apache.axis.SOAPPart.<init>(SOAPPart.java:1020)
 at org.apache.axis.Message.setup(Message.java:377)
 at org.apache.axis.Message.<init>(Message.java:235)
 at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:628)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
 at 
org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)

We are facing this issue because:
XMLUtils.getDocumentBuilder calls ThreadLocal.get
ThreadLocal.get calls ThreadLocalDocumentBuilder.initialValue
ThreadLocalDocumentBuilder.initialValue calls 
DocumentBuilderFactory.newInstance()
While creating an instance of DocumentBuilderFactory the classLoader is 
creating a ThreadLocal.


This re-entrant call to the ThreadLocalMap results in the NPE. This is a 
known issue according to Sun which has been fixed in Java SE 6. 
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5025230. We had a 
discussion regarding this on the JSR 166 concurrency list 
(http://altair.cs.oswego.edu/mailman/private/concurrency-interest/2006-June/002789.html) 
and the only work-around for this to work on JDK 1.4 and JDK 5 is NOT to 
override ThreadLocal.initialValue.

The current code is:

private static class ThreadLocalDocumentBuilder extends ThreadLocal {
  protected Object initialValue() {
    try {
      return getDOMFactory().newDocumentBuilder();
    } catch (ParserConfigurationException e) {
      log.error(Messages.getMessage("parserConfigurationException00"),
          e);
    }
    return null;
  }
}

Recommended code:
private static class ThreadLocalDocumentBuilder extends ThreadLocal {
  public Object get() {
    Object result = super.get();
    if(result == null){
      try {
        result = getDOMFactory().newDocumentBuilder();
        set(result);
      } catch (ParserConfigurationException e) {
        log.error(Messages.getMessage("parserConfigurationException00"),
            e);
      }
    }

    return result;
  }
}

Would it be possible to checkin this change?

rajkumar 


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org