将我们的应用程序升级到 Spring Boot 2.6.6 并结合 JBoss 7.3 后,我们在每次 xml 验证时都会收到以下警告:
2022-04-13 14:18:39,433 WARN [org.springframework.xml.validation.Jaxp15ValidatorFactory] (default task-2) http://javax.xml.XMLConstants/property/accessExternalDTD property not supported by org.apache.xerces.jaxp.validation.ValidatorImpl
2022-04-13 14:18:39,433 WARN [org.springframework.xml.validation.Jaxp15ValidatorFactory] (default task-1) http://javax.xml.XMLConstants/property/accessExternalSchema property not supported by org.apache.xerces.jaxp.validation.ValidatorImpl
由于验证数量较多,JBoss 磁盘充满了日志警告,导致磁盘已满。
最明显的解决方案是不使用 JBoss,但不幸的是,这在我们的生产环境中是不可能的。
发出警告的原因是 JBoss 7.3 使用旧的 Xerces 库 (2.2.12.0.SP03),它不支持以下属性:accessExternalDTD 和 accessExternalSchema 以及 spring-boot (2.6.6) 期望对此支持并记录警告当不支持时。
通常您应该更新到较新版本的 Xerces 库,但在 JBoss 的情况下这是不可能的,因为 Xerces 库与 JBoss 打包在一起。
此问题的解决方案是将 JBoss 中的日志记录设置更改为该特定日志记录的错误级别。这可以通过以下命令来完成:
${JBOSS_HOME}/bin/jboss-cli.sh --connect controller=localhost:9990 --user=<admin user> --password=<password> --command="/subsystem=logging/logger=org.springframework.xml.validation.Jaxp15ValidatorFactory:add"
${JBOSS_HOME}/bin/jboss-cli.sh --connect controller=localhost:9990 --user=<admin user> --password=<password> --command="/subsystem=logging/logger=org.springframework.xml.validation.Jaxp15ValidatorFactory:write-attribute(name=level, value=ERROR)"
提供的
ValidatorFactory
实现不支持上述属性。
正如 @Gerard 的回答中提到的,JBoss
org.apache.xerces
依赖提供了它的实现。
您可以将程序配置为使用支持或忽略上述属性的实现。
我在另一个类似答案中详细阐述了细节。
在添加
xmlparserv2
依赖项后遇到了同样的问题,因为类加载器突然开始加载不支持 oracle.xml.jaxp.JXSAXTransformerFactory
的 accessExternalDTD
,而不是像以前那样加载 TransformerFactoryImpl
。
发生这种情况是因为现在出现了
javax.xml.transform.TransformerFactory
的附加实现,并且类加载器加载了错误的实现。
解决方案是明确告诉 ClassLoader 要加载哪个类:
TransformerFactory tf = TransformerFactory.newInstance(
"com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl",
this.getClass().getClassLoader()
);
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
Transformer transformer = tf.newTransformer();