NullPointerException в DOMFactoryProperties weblogic при синтаксическом анализе XML-документа в Tomcat - PullRequest
2 голосов
/ 07 августа 2011

Я пытаюсь разобрать 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 (я использую JAR weblogic-клиента для подключения к внешним очередям 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();
  }

//...
}

Это сбой на линии1011 *.Единственной причиной для этого может быть значение null в COALESCING, но если какой-то другой класс не установит для него значение null (как, например, public static) извне, я не понимаю, почему это может бытьnull.

Есть идеи?

Можно ли как-то сказать, что Spring 10 * не использует XML reader из weblogic?

ОБНОВЛЕНИЕ : Что еще хуже, это не всегда воспроизводится в Tomcat для того же XML.Иногда это работает, иногда нет.

UPDATE2 : отладка показывает, что weblogic.xml.jaxp.DOMFactoryProperties.COALESCING действительно null.Но почему?

UPDATE3 : похоже, я могу сказать, какую реализацию SAXParserFactory использовать, установив javax.xml.parsers.SAXParserFactory системное свойство в com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl (платформа по умолчанию).Другой вопрос все еще остается.

Ответы [ 2 ]

1 голос
/ 07 августа 2011

Однажды у нас была похожая проблема, также возникающая только на Tomcat.Как я вижу, ваше приложение использует apache xalan (посмотрите на трассировку стека).Наше глубокое расследование доказало, что это было вызвано ненадлежащим созданием фабрики синтаксических анализаторов (насколько я помню) - возможно, странными конфликтами между библиотеками.В нашем случае добавление xalan JAR к зависимостям maven проекта (оно должно быть доступно в каталоге lib вашего веб-приложения) решило проблему.Я имею в виду - нам пришлось явно добавить эту зависимость, даже если проект был успешно построен без нее.

0 голосов
/ 27 апреля 2018

Большое спасибо @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.getOutputHandler (TransformerImpl.j.xalan.internal.xsltc.trax.TransformerImpl.transform (TransformerImpl.java:336) в com.xml.fda.sciencepapers.service.impl.DisplayServiceImpl.generateHTML (DisplayServiceImpl.java:114)

...

Строка 114 в DisplayServiceImpl вызывает метод transform для javax.xml.transform.Transformer.

Я решил проблему, добавив зависимость xalan в мой pom следующим образом:

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

А затем получил некоторый класс Serializer, не найденный Exception, и я также добавил эту зависимость:

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

Вот ссылка для загрузки сериализатора jar .

Примечание: я создалПапка lib сама, поместила ее в папку ресурсов и поместила в нее jar-файлы.

Edit: пролистайте текст выше, потому что я сменил место, откуда я получаю jars из локальной папки нахранилище maven.

...