FileTemplateLoader
問題は FreeMarker のクラスにあることが判明しました。baseDir.getCanonicalFile(...)
コンストラクターに渡された base-directory で呼び出しを行います。アプリケーションが起動すると、ベース ディレクトリはによって/var/cms/live
実際のパスに解決されるため、シンボリック リンクへの今後の変更は無視されます。/var/cms/trunk/127/
getCanonicalFile(...)
コンストラクターでこれを行うため、LocalFileTemplateLoader
以下にリストされている独自のものを作成する必要がありました。
これは、 の基本的なスプリング ロードの実装にすぎませんTemplateLoader
。次に、FreeMarker 構成を構築するときに、テンプレート ローダーを設定します。
Configuration config = new Configuration();
LocalTemplateLoader loader = new LocalTemplateLoader();
// this is designed for spring
loader.setBaseDir("/var/cms/live");
config.setTemplateLoader(loader);
...
これが私たちのLocalFileTemplateLoader
コードです。 ペーストビンの完全なクラス:
public class LocalFileTemplateLoader implements TemplateLoader {
public File baseDir;
@Override
public Object findTemplateSource(String name) {
File source = new File(baseDir, name);
if (source.isFile()) {
return source;
} else {
return null;
}
}
@Override
public long getLastModified(Object templateSource) {
if (templateSource instanceof File) {
return new Long(((File) templateSource).lastModified());
} else {
throw new IllegalArgumentException("templateSource is an unknown type: " + templateSource.getClass());
}
}
@Override
public Reader getReader(Object templateSource, String encoding) throws IOException {
if (templateSource instanceof File) {
return new InputStreamReader(new FileInputStream((File) templateSource), encoding);
} else {
throw new IllegalArgumentException("templateSource is an unknown type: " + templateSource.getClass());
}
}
@Override
public void closeTemplateSource(Object templateSource) {
// noop
}
@Required
public void setBaseDir(File baseDir) {
this.baseDir = baseDir;
// it may not exist yet because CMS is going to download and create it
}
}