我試圖解析一個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
實施。另一個問題仍然存在。
只需在'COALESCING'變量聲明行上放置一個斷點來調試訪問和修改。試圖將其修改爲「空」時,只需讀取調用它的堆棧(跟蹤)即可。 – BalusC
** BalusC **'DOMFactoryProperties'來自weblogic jar。我能夠對它進行反編譯並查看源代碼,我也能夠在此時將斷點放入'Hashtable'並查找'weblogic.xml.jaxp.DOMFactoryProperties.COALESCING'。但我不認爲有可能調試DOMFactoryProperties類中字段的訪問和修改。如果你知道如何讓我知道。 – parxier