花了我一兩個小時在排除這問題……,記錄一下。
上禮拜在客戶的環境下測試一隻程式時,發現程式會卡住不動,一開始我還以為,也許是程式要讀取的某個 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 意見:
張貼留言