Java weblogic中的NullPointerException';在Tomcat下解析XML文档时使用的DOMFactoryProperties
我试图解析一个XML,得到了一个我见过的最奇怪的Java weblogic中的NullPointerException';在Tomcat下解析XML文档时使用的DOMFactoryProperties,java,xml,tomcat,jaxb,weblogic,Java,Xml,Tomcat,Jaxb,Weblogic,我试图解析一个XML,得到了一个我见过的最奇怪的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.
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)
它在this.factoryProperties.put(COALESCING,Boolean.FALSE)行失败代码>。唯一的原因可能是合并
中的null
值,但除非其他类将其设置为null
(因为某种原因,它是公共静态
),否则我不明白为什么它可以是null
有什么想法吗
有没有办法告诉Spring的Jaxb2Marshaller
不要使用weblogic的XML阅读器
更新:更糟糕的是,对于同一个XML,在Tomcat下这甚至不总是可复制的。有时有效,有时无效
UPDATE2:调试显示weblogic.xml.jaxp.DOMFactoryProperties.COALESCING
确实是null
。但是为什么呢
UPDATE3:通过将javax.xml.parsers.SAXParserFactory
系统属性设置为com.sun.org.apache.xerces.internal.jaxp.saxparserfactorympl
(平台默认值),我似乎可以判断要使用的是SAXParserFactory
。另一个问题仍然存在。我们曾经有过类似的问题,也只发生在Tomcat上。正如我所看到的,您的应用程序使用ApacheXalan(查看堆栈跟踪)。我们的深入调查证明,这是由解析器工厂的不适当实例化(如我所记得的)造成的——可能是库之间的一些奇怪冲突。在我们的例子中,将XalanJAR添加到ProjectMaven依赖项(它应该在您的webapp的lib
目录中提供)解决了这个问题。我的意思是-我们必须明确添加此依赖项,即使项目在没有它的情况下成功构建。非常感谢@Piotr De
我有一个例外:
java.lang.NullPointerException
位于com.sun.org.apache.xalan.internal.xsltc.runtime.output.TransletOutputHandlerFactory.getSerializationHandler(TransletOutputHandlerFactory.java:186)
位于com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getOutputhHandler(TransformerImpl.java:453)
位于com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:336)
位于com.xml.fda.sciencepapers.service.impl.DisplayServiceImpl.generateHTML(DisplayServiceImpl.java:114)
DisplayServiceImpl中的第114行调用javax.xml.transform.Transformer的transform
方法
我通过将xalan依赖项添加到pom中解决了此问题,如下所示:
<!-- https://mvnrepository.com/artifact/xalan/xalan -->
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.7.2</version>
</dependency>
沙兰
注意:我自己创建了lib文件夹,将其放在resources文件夹中,并将jar放在其中
编辑:浏览上面的文本,因为我将JAR从本地文件夹获取的位置更改为maven存储库。只需在合并
变量声明行上放置一个断点,即可调试访问和修改。一旦尝试将其修改为null
,只需读取调用它的堆栈(跟踪)。BalusCDOMFactoryProperties
来自weblogic jar。我能够对其进行反编译并查看源代码,我还能够将断点放入哈希表
和查找weblogic.xml.jaxp.DOMFactoryProperties.COALESCING
。不过,我认为不可能调试DOMFactoryProperties
类中字段的访问和修改。如果你知道怎么做,请告诉我。
<!-- https://mvnrepository.com/artifact/xalan/xalan -->
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.7.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/xalan/serializer -->
<dependency>
<groupId>xalan</groupId>
<artifactId>serializer</artifactId>
<version>2.7.2</version>
</dependency>