2017-09-22 49 views
-1

我正在使用freemarker模板。 我landup具有波紋管的問題:使用cfg.getTemplate讀取Freemarker模板(路徑)

我保持一個文件[test.ftl]中的路徑"home/freemarker/test.ftl"

貝婁是我用來讀取模板

Code : 
    public Template read_template() 
     { 
     String template="home/freemarker/test.ftl";//local path 

     Configuration cfg = new Configuration(); 
     cfg.setIncompatibleImprovements(new Version(2, 3, 20)); 
     cfg.setDefaultEncoding("UTF-8"); 
     cfg.setLocale(Locale.US); 
     Template template = cfg.getTemplate(template); 
     return template; 
    } 

這workd完美代碼當我從void main調用它()

現在的問題是,當我在運行服務器時讀取它。

Template template = cfg.getTemplate(template); 此行引發文件未找到異常。

注:

String folder_path = RuntimeProperties.get("freemarker.TemplateDirectory");//for server 

這 我測試使用 只是一個普通的文本文件閱讀器的Java的功能從服務器

這是achivable,所以我確認讀取相同的文件test.ftl具有相同的路徑沒有路徑問題。 並且該文件位於相應的路徑中。

錯誤Filenot發現異常
cfg.getTemplate(FOLDER_PATH + 「test.ftl」); //只有這個

+0

您使用的是相對路徑。這可能會導致服務器混淆。你有沒有考慮過使用像「/home/freemarker/test.ftl」這樣的絕對路徑來確定路徑是否正確? –

+0

我已經清楚地指出「沒有路徑問題」,因爲我可以使用相同的路徑來讀取其他成功的文件。 – Coder

+0

有一個路徑問題。 – Oleg

回答

1

您沒有設置在Configuration一個TemplateLoader。由於您使用的密碼爲incompatibleImprovements,因此您的配置將使用脆弱且危險的傳統默認設置TemplateLoader,該默認設置將當前目錄用作模板根目錄。

我不知道究竟怎麼有你「的測試讀取相同的文件」,但如果你已經使用RuntimeProperties.get("freemarker.TemplateDirectory")作爲基本目錄存在,那麼這就是問題的來源。 FreeMarker不使用這樣的事情。 (我甚至不知道什麼API RuntimeProperties是。)當然,你應該有這樣的事情:

cfg.setTemplateLoader(
    new FileTemplateLoader(
     RuntimeProperties.get("freemarker.TemplateDirectory"))); 

而且,在項目升級FreeMarker的。有一段時間,錯誤信息告訴您(a)您正在使用已棄用的默認值,並應設置templateLoader設置,以及(b)嘗試從哪個物理位置加載模板。

(另外,我認爲真正的代碼結構不同,但爲了以防萬一,注意Configuration應該是單身,並且不應該重新對每個getTemplate電話。)