Загрузить шаблон бесплатного маркера из classpath - PullRequest
0 голосов
/ 14 марта 2012

У меня есть ресурс в aSpring MVCapplication, загруженный из пути к классам.

<bean id="myController" class="com.MyController">
        <property name="myTemplate" value="classpath:myTemplate.txt"/>

</bean>

И я пытаюсь загрузить его как шаблон бесплатного маркера, используя этот код:

private Resource myTemplate;

...

Configuration cfg = new Configuration();
cfg.setClassForTemplateLoading(this.getClass(), "/");
Template tpl = cfg.getTemplate(myResource.getFilename());

Но я продолжаю попадать в: java.io.FileNotFoundException: Шаблон classpath: myTemplate.txt не найден.

Я пытался реализовать то, что было предложено здесь , но, похоже, это не помогло.

Единственный хак, который я смог найти, это удалить префикс "classpath:" из имени файла String, но я предпочитаю этого не делать

Есть идеи ...?

1 Ответ

3 голосов
/ 14 марта 2012

Итак, вы говорите, что вы не хотите удалять "class:" из имени шаблона, и в соответствии с этим вопросом вы не хотите научить FreeMarker понимать его с помощью пользовательского TemplateLoader либо.Я имею в виду, если вы запретите это, что еще может решить это?Я могу только посоветовать вам сделать последнее;реализовать пользовательский TemplateLoader (либо тот, который просто удаляет префикс "class:", затем делегирует ClassTemplateLoader, или, что еще лучше, тот, который просто делегирует Spring ResourceLoader).Вот как вы настраиваете FreeMarker, чтобы делать то, что вы хотите.Это не что-то экстремальное, нужно реализовать собственный TemplateLoader.

Обновление: Полезно знать, что по умолчанию есть несоответствие между шаблоном FreeMarkerСинтаксис имени и Синтаксис имени ресурса Spring.В соответствии с синтаксисом Spring вы можете написать "classpath:foo.ftl" или "classpath:/foo.ftl".Но FreeMarker предполагает, что часть схемы всегда заканчивается ://, а одинокий : или :/ ничего особенного.Таким образом, все эти пути к ресурсам будут рассматриваться как относительные пути, и поэтому текущий каталог шаблонов будет добавлен перед ними перед фактическим разрешением шаблона.Чтобы решить эту проблему, начиная с FreeMarker 2.3.22, вы можете использовать Configuration.setTemplateNameFormat(TemplateNameFormat.DEFAULT_2_4_0) (template_name_format=DEFAULT_2_4_0 в Properties), который рассматривает : в качестве разделителя схемы.

...