DocumentBuilderFactory.setFeature調用失敗的問題分析、解決javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V異常


 mybatis啟動報錯

1. DocumentBuilderFactory加載順序

 

  • 使用 javax.xml.parsers.DocumentBuilderFactory 系統屬性;

 

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

 

  • 使用 JRE 文件夾中的屬性文件 "lib/jaxp.properties"。此配置文件格式為標准的 java.util.Properties 且包含實現類的完全限定名,其中實現類的鍵是上述定義的系統屬性。 JAXP 實現只讀取一次 jaxp.properties 文件,然后緩存其值供以后使用。如果首次嘗試讀取文件時,文件不存在,則不會再次嘗試檢查該文件是否存在。首次讀取 jaxp.properties 后,其中的屬性值不能再更改;

 

文件內容如下:

 

javax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

 

  • 使用 Services API(在 JAR 規范中進行了詳細描述)來確定類名稱。Services API 將查找在運行時可用的 jar 中 META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文件中的類名;

 

文件內容如下:

 

com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

 

  • 最后使用平台默認的 DocumentBuilderFactory 實例;

 

com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

 

2. 引起問題的原因

 

項目引入了xercesImpl,在該jar中有Services API的定義,導致DocumentBuilderFactory初始化為org.apache.xerces.jaxp.DocumentBuilderFactoryImpl,而在這個實現類中沒有setFeature方法

 

 

3. 嘗試解決方法

 

  • 項目中去除xercesImpl依賴

 

驗證結果:無法解決
問題原因:好多地方有對xercesImpl的依賴,項目中去除對該JAR的直接依賴解決不了問題,如果完全去除會對其它功能有影響;

 

依賴xercesImpl的JAR

 

commons-dbcp
jaxen
xtom

 

  • 在項目中增加Services API定義,把其設置為com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

 

驗證結果:無法解決
問題原因:實際還是使用了xercesImpl中定義的Services API

 

  • 調整DocumentBuilderFactory的創建方式

 

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

 

驗證結果:問題解決

 

  • 升級xercesImpl為有setFeature方法的高版本


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM