Невозможно загрузить шаблон бесплатного маркера, используя multipartResolver - PullRequest
0 голосов
/ 12 марта 2012

Я использую MultipartFile, настроенный в приложении Spring MVC через classpath:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="1000000"/>
    </bean>

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

    </bean>

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

    public class MyController
    {
        private Resource myTemplate;

        ....

        Configuration cfg = new Configuration();
        Template tpl = cfg.getTemplate(myTemplate.getFilename());

Нопри запуске я получаю сообщение об ошибке: Шаблон classpath: myTemplate.txt не найден

Я пытался использовать: cfg.setDirectoryForTemplateLoading(myTemplate.getFile().getParentFile()) для определения каталога, но это тоже не помогло.

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

1 Ответ

1 голос
/ 13 марта 2012

Из приведенного сообщения об ошибке я полагаю, myTemplate.getFilename() возвращает classpath:myTemplate.txt, а не myTemplate.txt. Это объяснило бы, почему это не работает, даже если вы установите каталог шаблона в myTemplate.getFile().getParentFile().

Но более фундаментальная проблема заключается в том, что вы, похоже, неправильно используете API FreeMarker. Обычно объект Configuration должен создаваться один раз в жизненном цикле приложения. Это среди прочего, потому что он содержит кэш шаблона. Если вы все равно не используете кеш шаблонов, вы можете загрузить шаблон в String и создать Template с помощью конструктора класса Template. (Однако, если это #include -s или #import -s другие шаблоны, то для этого FreeMarker вызовет cfg.getTemplate внутри.) Если вы хотите использовать cfg.getTemplate (и, следовательно, кеш тоже), то, вероятно, вы следует использовать TemplateLoader, который понимает эти имена ресурсов Spring, а затем настроить FreeMarker для использования этого (cfg.setTemplateLoader(yourTemplateLoader)). Я не знаю, содержит ли Spring такую ​​вещь или нет, но в целом нетрудно включить API хранилища в интерфейс TemplateLoader. (Это, безусловно, проще и надежнее в долгосрочной перспективе, чем пытаться «обмануть» FreeMarker при загрузке шаблона со специальным setDirectoryForTemplateLoading и тому подобным.)

...