国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記一次SPI機制導致的BUG定位【不支持:http://javax.xml.XMLConstants/property/accessExternalDTD】

這篇具有很好參考價值的文章主要介紹了記一次SPI機制導致的BUG定位【不支持:http://javax.xml.XMLConstants/property/accessExternalDTD】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、前因

今天在生產(chǎn)環(huán)境啟用了某個功能,結(jié)果發(fā)現(xiàn)有個文件上傳華為云OBS失敗了,報錯如下:

Caused by: java.lang.IllegalArgumentException: 不支持:http://javax.xml.XMLConstants/property/accessExternalDTD
        at org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:576) ~[xalan-2.7.1.jar:?]
        at com.obs.services.internal.xml.OBSXMLBuilder.asString(OBSXMLBuilder.java:306) ~[esdk-obs-java-bundle-3.23.9.1.jar:?]
        at com.obs.services.internal.V2Convertor.transCompleteMultipartUpload(V2Convertor.java:96) ~[esdk-obs-java-bundle-3.23.9.1.jar:?]
        at com.obs.services.internal.service.ObsMultipartObjectService.completeMultipartUploadImpl(ObsMultipartObjectService.java:96) ~[esdk-obs-java-bundle-3.23.9.1.jar:?]
        at com.obs.services.AbstractMultipartObjectClient.access$400(AbstractMultipartObjectClient.java:39) ~[esdk-obs-java-bundle-3.23.9.1.jar:?]
        at com.obs.services.AbstractMultipartObjectClient$5.action(AbstractMultipartObjectClient.java:185) ~[esdk-obs-java-bundle-3.23.9.1.jar:?]
        at com.obs.services.AbstractMultipartObjectClient$5.action(AbstractMultipartObjectClient.java:182) ~[esdk-obs-java-bundle-3.23.9.1.jar:?]
        at com.obs.services.AbstractClient.doActionWithResult(AbstractClient.java:388) ~[esdk-obs-java-bundle-3.23.9.1.jar:?]
        ... 50 more

2、BUG定位

首先看拋異常的第一條信息,org.apache.xalan.processor.TransformerFactoryImpl,這個類首先看名稱,后面帶了Impl,一般來說應(yīng)該是某個接口的實現(xiàn)類,因為這個是引用的jar包里報的錯,還是apache的jar包,一般來說不太可能是apache代碼寫錯了,所以很有可能是我們調(diào)這個接口的時候,調(diào)錯實現(xiàn)類了,實際上不應(yīng)該調(diào)apache的這個實現(xiàn)類。

直接來看調(diào)用方com.obs.services.internal.xml.OBSXMLBuilder的asString方法:

public String asString() throws TransformerException {
    TransformerFactory tf = TransformerFactory.newInstance();
    tf.setAttribute("http://javax.xml.XMLConstants/property/accessExternalDTD", "");
    tf.setAttribute("http://javax.xml.XMLConstants/property/accessExternalStylesheet", "");
    Transformer transformer = tf.newTransformer();
    transformer.setOutputProperty("omit-xml-declaration", "yes");
    StringWriter writer = new StringWriter();
    transformer.transform(new DOMSource(this.getDocument()), new StreamResult(writer));
    return writer.getBuffer().toString().replaceAll("|\r", "");
}

代碼里的TransformerFactory是個抽象類,整個方法中也沒有指定使用到底用哪個實現(xiàn)類,這個時候就應(yīng)該想到Java的SPI機制了,打開org.apache.xalan.processor.TransformerFactoryImpl所在Jar包,Jar包里有個文件夾META-INF,里面有個services的文件夾,這里面的文件,就指定了程序會使用TransformerFactory的哪個實現(xiàn)類,如下圖:
記一次SPI機制導致的BUG定位【不支持:http://javax.xml.XMLConstants/property/accessExternalDTD】,BUG大雜燴,java,spring,SPI,XML,OBS
打開該文件,文件內(nèi)容如下:

org.apache.xalan.processor.TransformerFactoryImpl

由于我們的程序里沒有相應(yīng)的SPI配置,所以程序會優(yōu)先使用org.apache.xalan.processor.TransformerFactoryImpl類

3、BUG修復

知道了問題所在,接下來就是要找到那個正確的類,我們進到TransformerFactory這個類里,由于我用的是IDEA,點類邊上的藍色按鈕就可以找到這個類的子類,如下圖:
記一次SPI機制導致的BUG定位【不支持:http://javax.xml.XMLConstants/property/accessExternalDTD】,BUG大雜燴,java,spring,SPI,XML,OBS
可以看到同樣叫TransformerFactoryImpl名字的,還有com.sun.org.apache.xalan.internal.xsltc.trax包下的類,然后我們就在項目的META-INF的目錄下新增services目錄(如果沒有的話),在該目錄下新增文件javax.xml.transform.TransformerFactory,如圖:
記一次SPI機制導致的BUG定位【不支持:http://javax.xml.XMLConstants/property/accessExternalDTD】,BUG大雜燴,java,spring,SPI,XML,OBS
文件內(nèi)容如下:

com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

再啟動服務(wù)時,服務(wù)就正常了

4、疑惑

眼尖的小伙伴可能會發(fā)現(xiàn),我這個異常是在生產(chǎn)環(huán)境拋出來的,難道我之前測試環(huán)境沒測出來這個問題嗎,是的,測試環(huán)境當時測的時候沒有指定實現(xiàn)類也沒有報錯,文件也正常上傳到了華為云OBS上,但是這個問題發(fā)生后,再在測試環(huán)境就沒法復現(xiàn)這個問題了,所以也沒有再深究。


找到問題了,我們在引入OBS的jar包時是這樣寫的:

<dependency>
	<groupId>com.huaweicloud</groupId>
	<artifactId>esdk-obs-java-bundle</artifactId>
	<version>[3.21.8,)</version>
</dependency>

這種寫法會導致使用最新版本的jar包,來看jar包的發(fā)布時間:
記一次SPI機制導致的BUG定位【不支持:http://javax.xml.XMLConstants/property/accessExternalDTD】,BUG大雜燴,java,spring,SPI,XML,OBS
我們測試的時候大概是在十月份,十一月、十二月都有過發(fā)布,功能啟用時間更是在后面,所以我們測試的jar跟生產(chǎn)的jar實際上版本是不一樣的,生產(chǎn)是3.23.9.1,而測試是3.23.9,我們將版本指定為3.23.9后查看com.obs.services.internal.xml.OBSXMLBuilder源碼,里面并沒有使用抽象類TransformerFactory,所以也不會有上面所說的問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-823576.html

到了這里,關(guān)于記一次SPI機制導致的BUG定位【不支持:http://javax.xml.XMLConstants/property/accessExternalDTD】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 記一次etcd全局鎖使用不當導致的事故

    記一次etcd全局鎖使用不當導致的事故

    前兩天,現(xiàn)場的同事使用開發(fā)的程序測試時,發(fā)現(xiàn)日志中報 etcdserver: mvcc: database space exceeded ,導致 etcd 無法連接。很奇怪,我們開發(fā)的程序只用到了 etcd 做程序的主備,并沒有往 etcd 中寫入大量的數(shù)據(jù),為什么會造成 etcd 空間不足呢?趕緊叫現(xiàn)場的同事查了下 etcd 存儲數(shù)據(jù)的

    2024年02月11日
    瀏覽(22)
  • 記一次swoole連接數(shù)太多導致的錯誤

    原先就有點擔心這個項目正式上線會出現(xiàn)各種問題,所以剛上線就趕緊查看日志 果然,頻繁出現(xiàn)錯誤: WARNING Server::accept_connection(): accept() failed, Error: Too many open files[24] 這個錯誤通常是由于操作系統(tǒng)限制了進程能夠打開的文件句柄數(shù)量,導致當前進程無法打開更多的文件,從

    2024年02月02日
    瀏覽(30)
  • 【現(xiàn)網(wǎng)】記一次并發(fā)沖突導致流量放大的生產(chǎn)問題

    【現(xiàn)網(wǎng)】記一次并發(fā)沖突導致流量放大的生產(chǎn)問題

    目錄 事故現(xiàn)象 轉(zhuǎn)賬 業(yè)務(wù)背景介紹 背景一:轉(zhuǎn)賬流程 轉(zhuǎn)賬流程 轉(zhuǎn)賬異常處理 轉(zhuǎn)賬異常處理流程圖 背景二:賬戶系統(tǒng)合并 實際全流程: 背景三:扣內(nèi)存數(shù)據(jù)庫邏輯 背景四:調(diào)用方重試邏輯 問題定位 總結(jié) ?資料獲取方法 生產(chǎn)環(huán)境,轉(zhuǎn)賬相關(guān)請求失敗量暴增。 直接原因 現(xiàn)網(wǎng)

    2024年02月14日
    瀏覽(21)
  • 記一次 .NET某工控 宇宙射線 導致程序崩潰分析

    記一次 .NET某工控 宇宙射線 導致程序崩潰分析

    為什么要提 宇宙射線 , 太陽耀斑 導致的程序崩潰呢?主要是昨天在知乎上看了這篇文章:莫非我遇到了傳說中的bug? ,由于 rip 中的0x41變成了0x61出現(xiàn)了bit位翻轉(zhuǎn)導致程序崩潰,截圖如下: 下面的評論大多是說由于 宇宙射線 ,這個太玄乎了,說實話看到這個 傳說bug 的提法

    2024年02月04日
    瀏覽(30)
  • 記一次 Mockito.mockStatic 泄漏導致的單元測試偶發(fā)報錯排查過程

    記一次 Mockito.mockStatic 泄漏導致的單元測試偶發(fā)報錯排查過程

    相信用 Java 寫過單元測試的讀者們對 Mockito 不會陌生。至于 Mockito 是什么,為什么要用 Mockito,本文不再贅述。本文記錄了一次在 Apache ShardingSphere 項目中,由 Mockito.mockStatic 使用不當導致的單元測試偶發(fā)報錯排查過程。 Mockito 自 3.4.0 起新增了一個方法 Mockito.mockStatic ,支持對

    2024年02月10日
    瀏覽(29)
  • 記一次BootCDN被黑產(chǎn)掛馬導致站點跳轉(zhuǎn)博彩網(wǎng)站的問題

    記一次BootCDN被黑產(chǎn)掛馬導致站點跳轉(zhuǎn)博彩網(wǎng)站的問題

    ? 近期發(fā)現(xiàn)公司某些站點出現(xiàn)偶爾跳轉(zhuǎn)博彩網(wǎng)站的現(xiàn)象,經(jīng)過排查發(fā)現(xiàn)該現(xiàn)象為供應(yīng)鏈投毒攻擊,BootCDN上的靜態(tài)資源無一例外均被污染, 當外站引入BootCDN的靜態(tài)資源時,如果請求攜帶的Referer頭為指定值(涉及公司隱私不便透露),User-Agent頭為手機瀏覽器UA,觸發(fā)惡意代碼注

    2024年02月08日
    瀏覽(17)
  • 記一次dlopen使用問題導致Framework重啟,tombstones、pmap與反匯編分析(上)

    記一次dlopen使用問題導致Framework重啟,tombstones、pmap與反匯編分析(上)

    :Android Framework 動態(tài)庫 動態(tài)鏈接 Binder Android Studio一次更新后發(fā)現(xiàn)install App,設(shè)備就重啟了,跑了一遍開機動畫但不是從開機第一屏開始重啟,tombstones內(nèi)容查看發(fā)現(xiàn)是 surfaceflinger 掛在 libbinder.so ,那install app做了什么這個不得而知,理論上有問題應(yīng)該掛的是PackageManager

    2024年04月08日
    瀏覽(25)
  • 記一次Git未Commit直接Pull導致本地代碼丟失后的挽救過程

    記一次Git未Commit直接Pull導致本地代碼丟失后的挽救過程

    第一次遇到這種問題,有點緊張... 好吧,廢話不多說,IDEA或者AndroidStudio進入Git Uncommiteed Changes - Unstash Changes: 在彈出的Unstash Changes對話框點View查看代碼,如果代碼是本地丟失的代碼,那么恭喜你,又可以繼續(xù)愉快的玩耍了。 不過千萬要注意不用隨便點到Drop,Clear按鈕。 這

    2024年02月06日
    瀏覽(96)
  • 記一次線上問題引發(fā)的對 Mysql 鎖機制分析

    最近雙十一開門紅期間組內(nèi)出現(xiàn)了一次因 Mysql 死鎖導致的線上問題,當時從監(jiān)控可以看到數(shù)據(jù)庫活躍連接數(shù)飆升,導致應(yīng)用層數(shù)據(jù)庫連接池被打滿,后續(xù)所有請求都因獲取不到連接而失敗 整體業(yè)務(wù)代碼精簡邏輯如下: 數(shù)據(jù)庫實例監(jiān)控: 當時通過分析上游問題流量限流解決后

    2024年02月05日
    瀏覽(28)
  • 記一次nginx配置不當引發(fā)的499與failover 機制失效

    nginx 499在服務(wù)端推送流量高峰期長期以來都是存在的,間或還能達到告警閾值觸發(fā)一小波告警,但主觀上一直認為499是客戶端主動斷開,可能和推送高峰期的用戶打開推送后很快殺死app有關(guān),沒有進一步探究問題根源。 然而近期在非高峰期也存在499超過告警閾值的偶發(fā)情況,

    2024年02月01日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包