Apache POI PPT项目抛出java.lang.IllegalArgumentException异常求助
Apache POI PPT 中
accessExternalDTD 属性不支持异常分析与解决 异常本质
这是非致命性警告/异常,POI的XMLHelper.trySet方法会捕获该异常并继续执行后续逻辑,因此代码仍能正常运行。
问题原因
POI处理XML时尝试设置XML安全属性http://javax.xml.XMLConstants/property/accessExternalDTD(JDK 1.8u191+引入的安全配置,用于控制外部DTD访问),但当前项目使用的TransformerFactory实现是org.docx4j.org.apache.xalan.processor.TransformerFactoryImpl(docx4j打包的旧版Xalan),该版本未实现对该属性的支持,因此抛出IllegalArgumentException。
解决方案
1. 升级或替换Xalan依赖
排除docx4j引入的旧版Xalan,改用支持该属性的版本或JDK内置的TransformerFactory:
<!-- Maven依赖排除示例 --> <dependency> <groupId>org.docx4j</groupId> <artifactId>docx4j-core</artifactId> <version>你的版本号</version> <exclusions> <exclusion> <groupId>org.apache.xalan</groupId> <artifactId>xalan</artifactId> </exclusion> </exclusions> </dependency>
排除后,JVM会自动使用内置的TransformerFactory实现,该实现支持accessExternalDTD属性。
2. 强制指定JDK内置TransformerFactory
在代码启动初期设置系统属性:
System.setProperty("javax.xml.transform.TransformerFactory", "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
或者通过JVM启动参数指定:
-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
3. 忽略警告(不影响功能时可选)
若不想调整依赖或代码,可将org.apache.poi.util.XMLHelper的日志级别设为ERROR,避免打印该警告信息。
异常日志
10:46:45.903 [main] DEBUG org.apache.poi.openxml4j.opc.ZipPackage - Save content types part 10:46:45.927 [main] WARN org.apache.poi.util.XMLHelper - SAX Feature unsupported [log suppressed for 5 minutes]http://javax.xml.XMLConstants/property/accessExternalDTD java.lang.IllegalArgumentException: Not supported: http://javax.xml.XMLConstants/property/accessExternalDTD at org.docx4j.org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:571) at org.apache.poi.util.XMLHelper.trySet(XMLHelper.java:284) at org.apache.poi.util.XMLHelper.getTransformerFactory(XMLHelper.java:224) at org.apache.poi.util.XMLHelper.newTransformer(XMLHelper.java:231) at org.apache.poi.openxml4j.opc.StreamHelper.saveXmlInStream(StreamHelper.java:56) at org.apache.poi.openxml4j.opc.internal.ZipContentTypeManager.saveImpl(ZipContentTypeManager.java:68) at org.apache.poi.openxml4j.opc.internal.ContentTypeManager.save(ContentTypeManager.java:450) at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:554) at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1487) at org.apache.poi.ooxml.POIXMLDocument.write(POIXMLDocument.java:227) at com.iep.generator.PptCreater.createPpt(PptCreater.java:526) at com.iep.generator.PptCreater.main(PptCreater.java:94) 10:46:45.970 [main] DEBUG org.apache.poi.openxml4j.opc.ZipPackage - Save package relationships
注:即使出现该异常,代码仍能正常运行。
内容的提问来源于stack exchange,提问作者Code Machine
相关产品推荐
相关产品推荐

