在JBoss中获取“http://javax.xml.XMLConstants/property/accessExternalDTD属性不支持”并使用springboot

问题描述 投票:0回答:3

将我们的应用程序升级到 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,但不幸的是,这在我们的生产环境中是不可能的。

java spring-boot jboss
3个回答
1
投票

发出警告的原因是 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)"

0
投票

提供的

ValidatorFactory
实现不支持上述属性。

正如 @Gerard 的回答中提到的,JBoss

org.apache.xerces
依赖提供了它的实现。

您可以将程序配置为使用支持或忽略上述属性的实现。

我在另一个类似答案中详细阐述了细节。


0
投票

在添加

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();
© www.soinside.com 2019 - 2024. All rights reserved.