有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在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) 个答案

  1. # 1 楼答案

    非常感谢@Piotr De

    我有个例外:

    java.lang.NullPointerException at com.sun.org.apache.xalan.internal.xsltc.runtime.output.TransletOutputHandlerFactory.getSerializationHandler(TransletOutputHandlerFactory.java:186) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getOutputHandler(TransformerImpl.java:453) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:336) at com.xml.fda.sciencepapers.service.impl.DisplayServiceImpl.generateHTML(DisplayServiceImpl.java:114)

    ...

    DisplayServiceImpl中的第114行调用了javax.xml.transform.Transformertransform方法

    我通过将xalan依赖项添加到pom中解决了这个问题,如下所示:

        <!  https://mvnrepository.com/artifact/xalan/xalan  >
        <dependency>
            <groupId>xalan</groupId>
            <artifactId>xalan</artifactId>
            <version>2.7.2</version>
        </dependency>
    

    然后得到了一些序列化程序类not found Exception,我还添加了这个依赖项:

    <!  https://mvnrepository.com/artifact/xalan/serializer  >
        <dependency>
            <groupId>xalan</groupId>
            <artifactId>serializer</artifactId>
            <version>2.7.2</version>
        </dependency>
    

    这里是下载serializer jar的链接

    注意:我自己创建了lib文件夹,将其放在resources文件夹中,并将JAR放在其中

    编辑:浏览上面的文本,因为我将JAR从本地文件夹获取的位置更改为maven存储库