Я использовал FreeMarker на некоторое время, но есть одна яркая часть функциональности, которая либо отсутствует, либо я просто не могу понять (я надеюсь, что последний!). Если вы передадите cfg.getTemplate() абсолютный путь, он просто не работает. Я знаю, что вы можете указать каталог шаблонов, но я не могу этого сделать, мой прецедент может обрабатывать файлы в любом каталоге. Есть ли способ установить FreeMarker для отображения абсолютных путей так, как ожидал любой пользователь?Использование Абсолютного Пути с FreeMarker
ответ
Мне пришлось использовать абсолютный путь, потому что шаблоны происходят в скрипте Ant, а шаблоны находятся в файловой системе и обнаружены с помощью набора файлов Ant. Я предполагаю, что это довольно уникальные требования ...
Во всяком случае, для потомков (до тех пор, как SO вверх), вот решение, которое работает:
public class TemplateAbsolutePathLoader implements TemplateLoader {
public Object findTemplateSource(String name) throws IOException {
File source = new File(name);
return source.isFile() ? source : null;
}
public long getLastModified(Object templateSource) {
return ((File) templateSource).lastModified();
}
public Reader getReader(Object templateSource, String encoding)
throws IOException {
if (!(templateSource instanceof File)) {
throw new IllegalArgumentException("templateSource is a: " + templateSource.getClass().getName());
}
return new InputStreamReader(new FileInputStream((File) templateSource), encoding);
}
public void closeTemplateSource(Object templateSource) throws IOException {
// Do nothing.
}
}
и инициализация:
public String generate(File template) {
Configuration cfg = new Configuration();
cfg.setTemplateLoader(new TemplateAbsolutePathLoader());
Template tpl = cfg.getTemplate(template.getAbsolutePath());
// ...
}
Freemarker по умолчанию использует FileTemplateLoader, который не позволит вам получать шаблоны извне «базового» каталога (который по умолчанию взят из системного свойства user.dir, поэтому это ваш домашний каталог). Что вы можете сделать, это:
- Явное создать FileTemplateLoader с BASEDIR установлен в вашей самой верхней директории из-под которой вы будете получать шаблоны (вы могли бы теоретически установить его с корнем, чтобы использовать абсолютные пути, но это ОЧЕНЬ ПЛОХАЯ ВЕЩЬ © с точки зрения безопасности).
- Напишите свой собственный загрузчик шаблонов, который будет иметь абсолютный путь, но затем убедитесь, что шаблон все еще находится внутри вашей папки с шаблонами. Если вы это сделаете, позаботьтесь о сравнении путей канонических файлов.
- Пересмотреть свой подход. Вам действительно нужны абсолютные пути для шаблонов?
Спасибо за ответ. В итоге я просто менял каталог шаблонов каждый раз, но создание пользовательского FileTemplateLoader было бы более правильным способом справиться с этим. Я, конечно, понимаю, почему это будет дырой в безопасности, если вы используете его для создания веб-страниц, но если он работает в обычном режиме, мне кажется, что стандартные разрешения linux должны быть достаточно хорошей профилактической мерой, нет? – dimo414
До тех пор, пока ваши разрешения настроены адекватно, да, вы должны быть в порядке. Я все еще не могу представить, почему вы использовали бы абсолютный путь, хотя ... похоже, что вы хотите либо сохранить шаблон в какой-то общей (не root) папке, либо, если они настраиваются для пользователя, где-то относительно пользовательский дом. Но я уверен, что у вас есть ваши причины - удачи в реализации. – ChssPly76
на самом деле это удалить начало «/», так что вам нужно, чтобы добавить его в
public Object findTemplateSource(String name) throws IOException {
File source = new File("/" + name);
return source.isFile() ? source : null;
}
проблема с принятое решение состоит в том, что имя пути уничтожается в FreeMarker до использования TemplateLoader. См TemplateCache:
name = normalizeName(name);
if(name == null) {
return null;
}
Template result = null;
if (templateLoader != null) {
result = getTemplate(templateLoader, name, locale, encoding, parseAsFTL);
}
Так что я думаю, что лучше использовать решение, как предложенный in this answer
Например
Configuration config = new Configuration();
File templateFile = new File(templateFilename);
File templateDir = templateFile.getParentFile();
if (null == templateDir){
templateDir = new File("./");
}
config.setDirectoryForTemplateLoading(templateDir);
Template template = config.getTemplate(templateFile.getName());
- 1. Использование абсолютного пути с os.stat
- 2. Использование абсолютного пути в зондировании privatePath
- 3. Использование «абсолютного» пути css в: не псевдокласс
- 4. Использование Абсолютного пути для ClassLoader getResourceAsStream()
- 5. Чтение Xml с абсолютного пути
- 6. Олицетворение с использованием абсолютного пути
- 7. Построение абсолютного пути с os.path.join()
- 8. Webpack - импорт с абсолютного пути
- 9. Загрузка класса с абсолютного пути
- 10. Загрузить файл с абсолютного пути
- 11. Конфигурация абсолютного пути Eclipse
- 12. Ti.Media.Android.scanMediaFiles для абсолютного пути
- 13. Получение абсолютного пути
- 14. Получение абсолютного пути изображения
- 15. RewriteRule до абсолютного пути?
- 16. Поиск абсолютного пути
- 17. Получение абсолютного пути объекта
- 18. CronJob требуют абсолютного пути
- 19. Использование абсолютного пути с командой запуска docker не работает
- 20. Perl использовать/требовать абсолютного пути?
- 21. Устранение абсолютного пути от относительного пути
- 22. Получение абсолютного пути от относительного пути
- 23. От абсолютного пути к относительному пути
- 24. django получение абсолютного пути FileField
- 25. Относительный URL-адрес Абсолютного Пути
- 26. Eclipse IFolder от абсолютного пути
- 27. Разрешение абсолютного пути в java.nio
- 28. Невозможно загрузить xml-файл с абсолютного пути
- 29. nodejs запустить скрипт с абсолютного пути
- 30. Проблема с получением абсолютного пути к файлу
спасибо. Я больше не разрабатываю этот проект, поэтому я не могу это проверить, но я уверен, что кто-то другой с моим же вопросом оценят это. – dimo414
Я принял ваш ответ, так как сообщество, похоже, соглашается, жаль, что это заняло так много времени! – dimo414