JDK 1.8 和 java.xml.transform.Transformer 的问题

Issues with JDK 1.8 and java.xml.transform.Transformer

我正在使用 java.xml.transform.Transformer 向 SOAP 请求添加身份验证 header。我的应用程序是 JDK1.8 上的 运行。

当执行下面的代码行时,我将随后的警告消息记录到控制台

代码片段:

transformer.transform(authenticationHeader, header.getResult());

记录的警告:

XML Parser does not recognize the feature http://xml.org/sax/features/validation

输出是一个警告,不会阻止请求成功完成,但我想从日志文件中删除。

我正在使用 Maven,没有明确指定 Xerces 或 Saxon、Xalan 等。我的应用程序使用的代码是使用 Maven cxf-codegen-plugin

当我调试这个问题时,我可以看到在 net.sf.saxon.event.Sender

中生成了警告

任何人都可以;

  1. 我的代码使用有效特征名称的解决方案或
  2. 一种从我的日志输出中抑制警告消息的方法

我们可能需要从两个方面来解决这个问题:(a) 为什么请求验证功能,以及 (b) 为什么解析器无法识别它。

(a) 为什么要求它?如果应用程序请求 DTD-based 验证,例如通过执行 Configuration.setValidation(true),Saxon 将请求此功能。可能还有许多其他地方可以提出此请求。

(b) 为什么不识别?名称 http://xml.org/sax/features/validation 被记录为 Apache Xerces 的一个特性,但我不知道 built-in JDK 解析器是否支持它:找到该文档并不容易。在 XMLReader javadoc 中,它没有被描述为每个解析器都必须识别的功能,但它被用作示例功能名称。我总是将我的环境配置为默认使用 Apache Xerces,因此需要一些努力来 运行 测试以查看在 Apache Xerces 不存在的情况下支持哪些功能。

也许解析器实际上不是 JDK 默认值,而是其他一些解析器 - 也许是 user-written 过滤器,它不是 "real" 解析器,但过滤来自真正的解析器(这很常见,并且此类过滤器不将配置设置传递给底层解析器是一个常见的错误)。不幸的是,在某些路径中,Saxon 会报告哪个解析器拒绝了请求,但对于这条特定路径而言情况并非如此。我会解决的。

不是忽略警告那么简单。如果应用程序请求 DTD 验证但没有发生,那可能会产生严重的后果。 Children 可能会死。