簡體   English   中英

Java 和 Xerces:找不到屬性 XMLConstants.ACCESS_EXTERNAL_DTD

[英]Java and Xerces: can't find property XMLConstants.ACCESS_EXTERNAL_DTD

我在這個博客上尋找類似的帖子,但找不到我的問題的答案,所以我決定尋求幫助。

我用 Java 編寫了這個簡單的函數:

 public void open(InputStream stream) throws FoliumFatalException {
        try {
            InputSource is = new InputSource(stream);
            DocumentBuilderFactory dfact = DocumentBuilderFactory.newInstance();

//            /* OWASP: inhibit access to External Entities */
            dfact.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); 
            dfact.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); 

            _doc = dfact.newDocumentBuilder().parse(is);

        } catch (Throwable t) {
            _logger.error(t, t);
            throw new FoliumFatalException("ENG-0017", "Errore di parsing su stream", t);
        }

    }

我的目標是應用此處公開的 OWASP 標准,但出現以下錯誤:

 java.lang.IllegalArgumentException: Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized.
java.lang.IllegalArgumentException: Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized.
    at org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.setAttribute(Unknown Source) ~[xercesImpl-2.8.0.jar:?]
    at agora.folium.engine.impl.j2ee.FoliumJ2eeXmlParserImpl.open(FoliumJ2eeXmlParserImpl.java:108) [classes/:?]
    at agora.folium.engine.impl.FoliumAbstractEngine.loadServices(FoliumAbstractEngine.java:268) [classes/:?]
    at agora.folium.engine.impl.j2ee.FoliumJ2eeEngineImpl.startup(FoliumJ2eeEngineImpl.java:110) [classes/:?]
    at agora.folium.engine.Folium.startup(Folium.java:258) [classes/:?]
    at agora.folium.control.impl.j2ee.FoliumActionServlet.init(FoliumActionServlet.java:94) [classes/:?]
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1230) [catalina.jar:7.0.85]
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1174) [catalina.jar:7.0.85]
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1066) [catalina.jar:7.0.85]
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5370) [catalina.jar:7.0.85]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5668) [catalina.jar:7.0.85]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) [catalina.jar:7.0.85]
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1015) [catalina.jar:7.0.85]
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:991) [catalina.jar:7.0.85]
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) [catalina.jar:7.0.85]
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:712) [catalina.jar:7.0.85]
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:2002) [catalina.jar:7.0.85]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_141]
    at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_141]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_141]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_141]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_141]

我正在使用 Eclipse Oxygen、Tomcat 7 和 Java 1.8。 誰能幫我?

謝謝您的支持。

javax.xml.XMLConstants.ACCESS_EXTERNAL_DTDJAXP 1.5 中定義,但 Xerces 不支持它。 如果您無法刪除 Xerces 依賴項,則應在 Xerces 之前向類路徑中添加另一個實現。

或者,由於 JDK 包含 Xerces 的實現,您可以配置DocumentBuilderFactory以使用System.properties返回 JDK 版本。

System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
        "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");

這個問題是由於類路徑中的 Xerces/XercesImpl 引起的。 Xerces 不提供對 ACCESS_EXTERNAL_DTD 屬性的支持。

解決方案 1. 如果可能,從類路徑中刪除 xerces jar。

解決方案2.使用JDK默認實現

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance("com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", null);

Apache Xerces-J 2.12.0 及更早版本實現了不支持您嘗試設置的任一屬性的較舊版本的 JAXP。 要阻止對外部實體的訪問,您可以編寫一個 EntityResolver(它總是拋出 SAXException)並將該 EntityResolver 注冊到 DocumentBuilder。 請參閱此處的文檔 [1]。

[1] http://xerces.apache.org/xerces2-j/javadocs/api/javax/xml/parsers/DocumentBuilder.html#setEntityResolver(org.xml.sax.EntityResolver)

我們的 Java 項目是用Maven構建的。 當團隊決定在管道中集成SonarQube時,我們遇到了類似的問題。 “SonarQube 不運行您的測試或生成報告。它只導入預先生成的報告”(更多關於這里)。 在 Java/Kotlin/Scala/JVM 的情況下,SonarQube 需要一些“ JaCoCo XML 覆蓋率報告”。 因此,我們必須向 pom.xml 添加一個依賴項:

<dependency>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>${jacoco.version}</version>
</dependency>

經過一些調整后,我們已經全部啟動並運行了。 但是一些測試失敗了“java.lang.IllegalArgumentException:屬性'http://javax.xml.XMLConstants/property/accessExternalDTD'不被識別。在org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.setAttribute(未知來源)。 ..”。

長話短說,解決方案是將 xerces 排除在圖片之外,正如其他答案中所述:

<dependency>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>${jacoco.version}</version>
  <exclusions>
    <exclusion>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
    </exclusion>
  </exclusions>
</dependency>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM