От новичка до гуру: Курсы программирования на CyberDuff

Шаблон Freemarker не загружается

Я использую Spring + Freemarker в качестве шаблона для отправки писем, но каждый раз, когда я пытаюсь отправить письмо, я получаю сообщение

freemarker.template.TemplateNotFoundException: Template not found for name "template.ftl".

Мой код следующий:

 // Configuration - AppConfig.java
@Bean
public freemarker.template.Configuration freeMarkerConfigurationFactory() throws Exception{
    FreeMarkerConfigurationFactory fmcf = new FreeMarkerConfigurationFactory();
    fmcf.setTemplateLoaderPath("classpath:/META-INF/freemarker/");          
    fmcf.setPreferFileSystemAccess(false);
    fmcf.setDefaultEncoding("UTF-8");        
    return fmcf.createConfiguration();
}

Служба отправки почты

    @Override
    @Async
    public void sendActivationMail(User user, HttpServletRequest request, String restorePasswordId) throws MailException, MessagingException, GetDataException {                 
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));             
        mimeMessage.setSubject(SOFTWARE_NAME + " - Activation");
        mimeMessage.setHeader("content-type", "text/html");    
        Map map = new HashMap();
        map.put("link", ServletUtility.getCompleteAdress(request)+"/auth/confirm/"+restorePasswordId);        
        try{
            mimeMessage.setContent(FreeMarkerTemplateUtils.processTemplateIntoString(freeMakerConfiguration.getTemplate("template.ftl"), map),
                    "text/html; charset=utf-8");
        }catch(Exception e){e.printStackTrace();}
        mailSender.send(mimeMessage);        
    }

А это мое дерево каталогов:

    src
    -main
    --java
    --- it.navium.secutor
    ----AppConfig.java
    --resources
    --webapp
    ---META-INF
    ----freemarker
    -----template.ftl

  • src/main/webapp не является путем к классам... Поэтому попытка загрузки из classpath:META-INF не сработает, если вы не переместите META-INF в src/main/resources. 28.11.2016
  • Спасибо, я решил разместить каталог шаблонов в src/main/resources, и это работает! :) 28.11.2016

Ответы:


1

Выполните следующие 3 действия, и все будет готово:

  1. Переименуйте каталог webapp в WEB-INF.
  2. потеряйте промежуточный каталог META-INF, что означает, что ваша новая древовидная структура будет выглядеть так:
-WEB-INF
--freemarker
---template.ftl
  1. Измените в своем определении FreeMarker Bean литерал строки classpath на: fmcf.setTemplateLoaderPath("classpath:/freemarker/");
28.11.2016

2

Весенний ботинок

Если вы используете весеннюю загрузку, расположение шаблона должно быть resources/templates. Взгляните на раздел справочной документации Двигатели шаблонов:

....

Spring Boot включает поддержку автоматической настройки для следующих механизмов шаблонов:

  • FreeMarker
  • заводной
  • Лист тимьяна
  • Скорость (устарела в версии 1.4)
  • Усы

.....

Когда вы используете один из этих шаблонизаторов с конфигурацией › по умолчанию, ваши шаблоны будут автоматически выбраны из ›src/main/resources/templates.

28.11.2016
  • Нет ничего, что могло бы продемонстрировать использование Spring Boot, чтобы предположить это. 28.11.2016
  • @dimitrisli Почему минус? Я дал ответ для пользователей весенней загрузки, возможно, это будет кому-то полезно, если вы прочитаете ответ, который я скажу, если вы используете весеннюю загрузку. И, наконец, кажется, он решает свой вопрос моим ответом. Итак, на мой взгляд, ваш ответ был бы правильным, но это альтернатива весенней загрузке, и это неплохой ответ. 28.11.2016
  • удаление отрицательного голоса из-за последнего комментария автора, до сих пор неясно, использовал ли он Spring Boot. 28.11.2016
  • не могли бы вы как-то отредактировать свой ответ, так как он не позволяет мне удалить отрицательный голос, поскольку он был отдан более 3 часов назад, если он не был отредактирован. Так что я предполагаю, что какое-то фиктивное редактирование сделает это. 28.11.2016
  • @dimitrisli Отредактировано ;) 28.11.2016
  • Новые материалы

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

    Игра в прятки с данными
    Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

    «Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
    TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

    Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
    Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

    Все о кейсах: Camel, Snake, Kebab & Pascal
    В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..