2017-09-22 9 views
-1

私はfreemarkerテンプレートを使用しています。 私は怒鳴る問題を持つlandup:Freemarker cfg.getTemplate(パス)を使用したテンプレートの読み取り

私はパスで[test.ftl] "home/freemarker/test.ftl"

ベローiはテンプレート

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()から呼び出すと、

ここで問題は、サーバを走らせている間にそれを読むときです。

テンプレートテンプレート= cfg.getTemplate(template); この行は、ファイルが見つかりませんでした例外をスローします。

注:私は

サーバー

からのJavaの 普通のテキストファイルリーダー機能を使用してこれは私が確認achivableた同じパスで同じファイル test.ftlを読んテスト

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

パスの問題はありません。 ファイルはそれぞれのパスで使用できます。

エラーFilenotは例外
cfg.getTemplate(folder_path + "test.ftl")を見つけ; //これだけ

+0

あなたは相対を使用していますパス。これにより、サーバーに混乱が生じる可能性があります。 "/home/freemarker/test.ftl"のような絶対パスを使ってパスが正しいことを本当に確かめることを考えましたか? –

+0

私は明確に "パスの問題はありません"と言いました。私は同じパスを使用して、他のファイルを読み込むことができます。 – Coder

+0

パスの問題があります。 – Oleg

答えて

1

であなたはConfigurationTemplateLoaderを設定していません。 incompatibleImprovementsを使用していないので、現在のディレクトリをテンプレートのルートディレクトリとして使用する脆弱で危険な従来のデフォルトのTemplateLoaderが使用されます。

"同じファイルを読み込んだことがどのくらいテストされたか"はわかりませんが、そこにベースディレクトリとしてRuntimeProperties.get("freemarker.TemplateDirectory")を使用していた場合は、問題の原因となります。 FreeMarkerはそのようなものを使用しません。 (私もAPI RuntimePropertiesが何であるかを知らない。)確かに、あなたがこのようなものが必要です。また

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

を、そのプロジェクトにFreeMarkerのをアップグレードします。しばらくの間、エラーメッセージは、(a)廃止されたデフォルト値を使用しており、templateLoaderの設定を設定する必要があります。また、(b)テンプレートをロードしようとする物理的な場所から設定する必要があります。

(また、私は実際のコードは異なる構造が、念のため、Configurationはシングルトンであるべきであり、各getTemplateコールのために再作成されるべきではないことに注意されているとします。)

関連する問題