2011-08-07 52 views
2

我試圖解析一個XML並得到一個奇怪的NullPointerException我見過。這裏的堆棧跟蹤:在Tomcat下解析XML文檔時,weblogic的DOMFactoryProperties中出現NullPointerException

java.lang.NullPointerException 
    at java.util.Hashtable.put(Hashtable.java:399) 
    at weblogic.xml.jaxp.DOMFactoryProperties.<init>(DOMFactoryProperties.java:44) 
    at weblogic.xml.jaxp.DOMFactoryProperties.clone(DOMFactoryProperties.java:114) 
    at weblogic.xml.jaxp.RegistryDocumentBuilderFactory.newDocumentBuilder(RegistryDocumentBuilderFactory.java:140) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.SAX2DOM.createDocument(SAX2DOM.java:324) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.SAX2DOM.<init>(SAX2DOM.java:84) 
    at com.sun.org.apache.xalan.internal.xsltc.runtime.output.TransletOutputHandlerFactory.getSerializationHandler(TransletOutputHandlerFactory.java:187) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getOutputHandler(TransformerImpl.java:392) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerHandlerImpl.setResult(TransformerHandlerImpl.java:137) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.DomLoader$State.<init>(DomLoader.java:74) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.DomLoader.startElement(DomLoader.java:113) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.ProxyLoader.startElement(ProxyLoader.java:55) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:455) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:433) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2755) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at weblogic.xml.jaxp.WebLogicXMLReader.parse(WebLogicXMLReader.java:133) 
    at weblogic.xml.jaxp.RegistryXMLReader.parse(RegistryXMLReader.java:173) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:211) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:105) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:584) 
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:571) 

首先,它只有當我的應用程序在Tomcat下部署(我使用WebLogic客戶端JAR連接到外部的WebLogic JMS隊列)發生。我在Tomcat以外的測試中無法複製它。所以我懷疑一些類加載器怪異或什麼。

其次,我試圖反編譯DOMFactoryProperties類,這裏是一個構造函數,是造成該NPE:

public class DOMFactoryProperties 
{ 
    public static String COALESCING = "Coalescing"; 
    public static String EXPANDENTITYREFERENCES = "ExpandEntityReferences"; 
    public static String IGNORINGCOMMENTS = "IgnoringComments"; 
    public static String IGNORINGELEMENTCONTENTWHITESPACE = "IgnoringElementContentWhitespace"; 
    public static String NAMESPACEAWARE = "Namespaceaware"; 
    public static String VALIDATING = "Validating"; 

    public static String SCHEMA = "Schema"; 

    public static String XINCL = "XIncludeAware"; 
    private Hashtable factoryProperties; 
    private Set facPropertySettingMarks; 
    private LinkedHashMap attributes; 

    public DOMFactoryProperties() 
    { 
    this.factoryProperties = new Hashtable(); 
    this.factoryProperties.put(COALESCING, Boolean.FALSE); 
    this.factoryProperties.put(EXPANDENTITYREFERENCES, Boolean.TRUE); 
    this.factoryProperties.put(IGNORINGCOMMENTS, Boolean.FALSE); 
    this.factoryProperties.put(IGNORINGELEMENTCONTENTWHITESPACE, Boolean.FALSE); 
    this.factoryProperties.put(NAMESPACEAWARE, Boolean.FALSE); 
    this.factoryProperties.put(VALIDATING, Boolean.FALSE); 
    this.factoryProperties.put(XINCL, Boolean.FALSE); 

    this.facPropertySettingMarks = new HashSet(); 

    this.attributes = new LinkedHashMap(); 
    } 

//... 
} 

它的失敗就行了this.factoryProperties.put(COALESCING, Boolean.FALSE);。唯一的原因可能是COALESCING中的null值,但除非某些其他類將其設置爲null(因爲它是public static出於某種原因),所以我不明白爲什麼它可以是null

有什麼想法?

有什麼辦法可以告訴Spring的 Jaxb2Marshaller不使用weblogic的XML讀取器嗎?

UPDATE:更糟糕的是,這甚至在Tomcat下對於相同的XML也不總是可重現的。有時它起作用,有時它不起作用。

UPDATE2:Debug顯示weblogic.xml.jaxp.DOMFactoryProperties.COALESCING確實是null。但爲什麼?

UPDATE3:它看起來像我可以告訴通過javax.xml.parsers.SAXParserFactory系統屬性設置爲com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl(平臺默認)使用哪種SAXParserFactory實施。另一個問題仍然存在。

+0

只需在'COALESCING'變量聲明行上放置一個斷點來調試訪問和修改。試圖將其修改爲「空」時,只需讀取調用它的堆棧(跟蹤)即可。 – BalusC

+0

** BalusC **'DOMFactoryProperties'來自weblogic jar。我能夠對它進行反編譯並查看源代碼,我也能夠在此時將斷點放入'Hashtable'並查找'weblogic.xml.jaxp.DOMFactoryProperties.COALESCING'。但我不認爲有可能調試DOMFactoryProperties類中字段的訪問和修改。如果你知道如何讓我知道。 – parxier

回答

0

我們曾經有類似的問題,也只發生在Tomcat上。正如我可以看到你的應用程序使用Apache xalan(看一下堆棧跟蹤)。我們深入的調查證明,它是由解析器工廠的不適當實例化引起的(我記得) - 可能是庫之間的一些奇怪的衝突。在我們的例子中,將xalan JAR添加到項目的maven依賴項中(應該可以在web應用程序的lib目錄中找到)解決了這個問題。我的意思是 - 即使沒有它成功構建項目,我們也必須明確添加此依賴項。