在Tomcat下解析XML文档时,weblogic的DomainFactoryProperties中存在java NullPointerException
我试图解析一个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.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();
}
//...
}
它在线路上失败了。唯一的原因可能是COALESCING
中的null
值,但除非其他类从外部将其设置为null
(因为某种原因是public static
),否则我不明白为什么会是null
知道吗
有没有办法告诉Spring的Jaxb2Marshaller
不要使用weblogic的XML阅读器罢工>
更新:更糟的是,在Tomcat下,对于同一个XML,这甚至不总是可以复制的。有时有效,有时无效
UPDATE2:调试显示weblogic.xml.jaxp.DOMFactoryProperties.COALESCING
确实是null
。但为什么呢
UPDATE3:通过将javax.xml.parsers.SAXParserFactory
系统属性设置为com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
(平台默认值),我似乎可以判断使用SAXParserFactory
的哪个实现。另一个问题仍然存在
# 1 楼答案
非常感谢@Piotr De
我有个例外:
DisplayServiceImpl中的第114行调用了
javax.xml.transform.Transformer
的transform
方法我通过将xalan依赖项添加到pom中解决了这个问题,如下所示:
然后得到了一些序列化程序类not found Exception,我还添加了这个依赖项:
这里是下载serializer jar的链接德尔>
注意:我自己创建了lib文件夹,将其放在resources文件夹中,并将JAR放在其中德尔>编辑:浏览上面的文本,因为我将JAR从本地文件夹获取的位置更改为maven存储库