JDK 1.8和java.xml.transform.Transformer

时间:2015-11-11 15:42:19

标签: java xml xml-parsing saxon

我正在使用java.xml.transform.Transformer将身份验证标头添加到SOAP请求中。我的应用程序在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. 的解决方案
  3. 一种从日志输出中删除警告消息的方法

1 个答案:

答案 0 :(得分:1)

我们可能需要从两端攻击这个:(a)为什么要求验证功能,以及(b)解析器为什么不识别它。

(a)为什么要求?如果应用程序请求基于DTD的验证,Saxon将请求此功能,例如通过执行Configuration.setValidation(true)。这个请求可能有很多其他地方可以做。

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

也许解析器实际上不是JDK默认值,而是其他一些解析器 - 可能是用户编写的过滤器,它不是“真正的”解析器,但过滤了真正解析器的输出(这很常见,而且它是此类过滤器的一个常见错误是不将配置设置传递给底层解析器)。不幸的是,Saxon报告了哪些解析器拒绝了请求的路径,但这种特定路径不是这种情况。我会解决这个问题。

这并不像忽略警告那么简单。如果应用程序正在请求DTD验证并且没有发生,则可能会产生严重后果。孩子们可能会死。