0

尝试使用 sonarqube 中给出的修复程序。

        *TransformerFactory tfactory = TransformerFactory.newInstance();
        tfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
        tfactory.setAttribute(javax.xml.XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
        return tfactory;*

但我在 setAttribute 上遇到运行时异常:“java.lang.IllegalArgumentException:未知配置属性http://javax.xml.XMLConstants/property/accessExternalDTD”

这似乎是因为使用 [9.7] 的 saxon jar 版本中的错误。它在 saxon 10.3 上运行良好。有关此错误,请参阅https://saxonica.plan.io/issues/4729

以下是我的问题:

  1. 有没有办法让它在我现有的撒克逊版本上工作(不升级到 10.x)。尝试使用 transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true) 但 sonarqube 不满意,因为它期望上述修复。

  2. 如果升级到 10.x 是唯一的方法,那么下面是我面临的挑战:

    我正在为某些业务逻辑覆盖 TraceListener 中的方法。但是方法签名在最新版本上发生了变化,如下所示:

    类 - net.sf.saxon.lib.TraceListener

    Saxon 9.7 -> public void enter(InstructionInfo 指令,XPathContext 上下文)

    Saxon 10.x -> public void enter(可跟踪指令,java.util.Map<java.lang.String,java.lang.Object> 属性,XPathContext 上下文)

    我目前的代码:

    *@Override
    public void enter(InstructionInfo instruction, XPathContext context) {
     int data = instruction.getConstructType();
     if ((data == 155) || (data == 200)) {
         .......logic......
     }
    }*
    

我的新代码将是:

   *@Override
   public void enter(Traceable instruction,           
    java.util.Map<java.lang.String,java.lang.Object> properties, XPathContext context){
    --> what to use here for getConstructType()
    if ((data == 155) || (data == 200)) {
        .......logic......
    }
   }*

所以问题是 10.x jar 在其 Traceable 类或 InstructionInfo 类中没有 getConstructType() 方法。如何在 10.x 版本中使用 getConstructType()?

PS:如果第一个问题得到回答,那将非常有帮助,即)如果我能够用我当前版本的 jar 来解决,因为新版本需要测试整个项目的所有功能:(希望有人能帮助我,谢谢进步。

4

1 回答 1

1

第一点:有点争论,这不是 Saxon 9.7 中的错误。TransformerFactory(在 Java 8 中)的 Javadoc 说“所有实现 JAXP 1.5 或更高版本的实现都需要支持 XMLConstants.ACCESS_EXTERNAL_DTD 和 XMLConstants.ACCESS_EXTERNAL_STYLESHEET 属性。” 但 Saxon 9.7 从未声称实现了 JAXP 1.5,它只声称实现了 JAXP 1.3。

说“我想继续使用 Saxon 的旧版本,但我不能,因为我想要一个支持 JAXP 新功能的版本”是可以理解的,但实际上不是很合乎逻辑。

对此的一种解决方案是添加您自己的 TransformerFactory API 实现,它会拦截设置此属性的尝试并且不会将其传递给 Saxon。

请注意,此属性无论如何都在错误的位置。DTD 处理是 XML 解析器的职责,而不是 XSLT 处理器的职责。该规范并没有明确说明它应该具有什么效果。如果 XSLT 处理器实例化 XML 解析器,它应该传递属性似乎是合理的,但如果它不被接受,它应该怎么做?如果 XML 解析器是由用户应用程序而不是由 XSLT 处理器创建的,它是否应该传递它?通常,尝试在 JAXP 规范中实现这样的规则是一个非常令人沮丧的练习,这些规则通常非常模糊地指定。

我一般会鼓励你尽量跟上新的撒克逊版本,以避免遇到已经解决的问题。是的,确实我们偶尔会修改一些“系统编程”接口的设计,比如TraceListener接口。10.3版本的这个接口替换InstructionInfoTraceable,要搞清楚是什么类型的Traceable,应该用instanceof.

当我们进行更改时,我们通常会在一个主要版本中引入新的 API,并在下一个版本中删除旧的 API。如果您一次跳进三个主要版本(9.7 到 10,跳过 9.8 和 9.9),那么您将无法利用这些过渡辅助工具。

于 2021-10-29T21:43:41.257 回答