Poi и Xerces: исключение для окон - PullRequest
1 голос
/ 07 ноября 2019

У меня есть веб-приложение Spring Boot / Maven / Java 8 / Tomcat 8.5, которое работает с файлами docx. На Mac это работает нормально, но на Windows я получаю странные исключения. Я пробовал в обеих средах с одинаковыми входными данными и получил разные результаты. На Mac я получил то, что ожидал, на вдов я получил только исключения.

java.lang.ExceptionInInitializerError: null
    at org.apache.poi.openxml4j.opc.internal.ContentTypeManager.parseContentTypesFile(ContentTypeManager.java:392) ~[poi-ooxml-4.0.0.jar:4.0.0]

[...]

Caused by: java.lang.IllegalArgumentException: No attributes are implemented
    at org.apache.crimson.jaxp.DocumentBuilderFactoryImpl.setAttribute(DocumentBuilderFactoryImpl.java:93) ~[crimson-1.1.3.jar:na]
    at org.apache.poi.ooxml.util.DocumentHelper.trySetXercesSecurityManager(DocumentHelper.java:143) ~[poi-ooxml-4.0.0.jar:4.0.0]
    at org.apache.poi.ooxml.util.DocumentHelper.<clinit>(DocumentHelper.java:108) ~[poi-ooxml-4.0.0.jar:4.0.0]
    ... 30 common frames omitted

Итак, после некоторого поиска я добавил некоторые значения в мои catalina.properties. Здесь уже прочитаны темы:

javax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
javax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
javax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

и теперь приложения, кажется, работают с некоторыми входами, в то время как я все еще получаю NullPointers с другими. Кроме того, в обоих случаях запрашивается новый журнал (включена отладка java).

JAXP: find factoryId =javax.xml.stream.XMLInputFactory
JAXP: loaded from fallback value: com.sun.xml.internal.stream.XMLInputFactoryImpl
JAXP: created new instance of class com.sun.xml.internal.stream.XMLInputFactoryImpl using ClassLoader: null
JAXP: find factoryId =javax.xml.transform.TransformerFactory
JAXP: found system property, value=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
JAXP: created new instance of class com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl using ClassLoader: null
JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory
JAXP: found system property, value=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
JAXP: created new instance of class com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl using ClassLoader: null

, что мне не кажется подходящим.

В моем ПОМ я переключился с

        <dependency> 
            <groupId>xerces</groupId> 
            <artifactId>xercesImpl</artifactId> 
            <version>2.12.0</version> 
        </dependency> 

до

<dependency>
  <groupId>xerces</groupId>
  <artifactId>xercesImpl</artifactId>
  <version>2.11.0</version>
  <exclusions>
    <exclusion>
      <groupId>xerces</groupId>
      <artifactId>xml-apis</artifactId>
    </exclusion>
  </exclusions>
</dependency>

без изменений.

Что происходит?

Спасибо за вашу помощь.

...