[心得] 在無法對外連線的環境下使用 dom4j 時,記得關閉 DTD 驗証功能

花了我一兩個小時在排除這問題……,記錄一下。

上禮拜在客戶的環境下測試一隻程式時,發現程式會卡住不動,一開始我還以為,也許是程式要讀取的某個 XML 檔被其他的程式 lock 住了,才會讀不出來。後來耐心的等程式把 exception 吐出來,才發現問題出在 dom4j 上頭。

因為 dom4j 在解析 XML 檔時,也會一併去抓取該 XML 所指定的 DTD 檔下來做驗証,但因為客戶機房的環境是不能對外的,所以 dom4j 在取不到 DTD 文件後,就會吐出 exception,程式就會失效了。

解決辦法也很簡單,在使用 SAXReader 讀取 XML 檔之前,記得先將 SAXReader 的 XML DTD 驗証功能關掉就可以了,如下︰

SAXReader saxReader = new SAXReader();
// 以下兩行其實是相同的東西;
// saxReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
saxReader.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.LOAD_EXTERNAL_DTD_FEATURE, false);  

0 意見: