java - Tomcat下解析XML文档时weblogic的DOMFactoryProperties出现NullPointerException

标签 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.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 阅读器吗?

更新:更糟糕的是,对于相同的 XML,这在 Tomcat 下甚至并不总是可重现的。有时有效,有时无效。

UPDATE2:调试显示 weblogic.xml.jaxp.DOMFactoryProperties.COALESCING 确实是 null。但是为什么?

UPDATE3:看起来我可以通过将 javax.xml.parsers.SAXParserFactory 系统属性设置为来判断要使用哪个 SAXParserFactory 实现com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl(平台默认)。另一个问题仍然存在。

最佳答案

我们曾经遇到过类似的问题,同样只发生在 Tomcat 上。如我所见,您的应用程序使用 apache xalan(查看堆栈跟踪)。我们的深入调查证明,这是由解析器工厂的不适当实例化引起的(我记得)——可能是库之间存在一些奇怪的冲突。在我们的例子中,将 xalan JAR 添加到项目 maven 依赖项(它应该在您的 webapp 的 lib 目录中可用)解决了这个问题。我的意思是 - 即使项目在没有它的情况下成功构建,我们也必须显式添加此依赖项。

关于java - Tomcat下解析XML文档时weblogic的DOMFactoryProperties出现NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6970498/

相关文章:

java - 将 Map 转换为 JSON

java - 调整 JPanel 的大小以准备打印,而无需将其从原始位置移开

java - 对 android 编程,当我构建项目时,我的布局 xml 文件不会更新

java - 我没有在 Tomcat 中的 Web 应用程序的线程中获取 Hibernate session

java - JSF 托管 bean 在 Tomcat 部署期间导致 java.io.NotSerializableException

java - 无法 pip 安装 javabridge

java - 登录 Google App Engine 无法正常工作

c# - 将对象序列化为 XML,仅使用引用 ID

javascript - 在javascript中循环遍历json

tomcat - 在 Netbeans 6.9 中,如何更改应用程序服务器