Получение текста шаблона из FreeMarker в приложении Spring
-
04-07-2019 - |
Вопрос
В моем приложении Spring я хотел бы использовать FreeMarker для генерации текста электронных писем, которые будут отправлены моим приложением.Сгенерированный текст никогда не будет возвращен в представление, поэтому мне не нужно настраивать распознаватель представлений FreeMarker.Документация, похоже, указывает, что я должен настроить FreeMarkerConfigurationFactoryBean следующим образом
<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
</bean>
Как только я настрою этот компонент, как мне на самом деле получить текст, сгенерированный для определенного шаблона, с определенной картой переменных.Другими словами, какой код появляется после:
String templateName = "email"
Map templateVars = new HashMap();
templateVars.put("firstName", "john");
templateVars.put("surname", "doe");
// Now how do I get the template text?
Пружинные модули кажется, обеспечивает альтернативную интеграцию между Spring и FreeMarker, которая делает извлечение текста шаблона очень очевидным, но я бы предпочел не добавлять дополнительную зависимость к моему приложению, если это не является абсолютно необходимым.
Кроме того, нужно ли мне добавить некоторую дополнительную конфигурацию к FreeMarkerConfigurationFactoryBean, чтобы гарантировать, что шаблоны кэшируются?
Приветствия, Дон
Решение
Что-то вроде этого должно сработать
Перед предоставленным вами кодом инициализируйте:
MailSender mailSender = new JavaMailSenderImpl();
SimpleMailMessage message = new SimpleMailMessage();
Затем, после вашего кода, добавьте:
StringBuffer content = new StringBuffer();
try {
content.append(FreeMarkerTemplateUtils.processTemplateIntoString(
configuration.getTemplate(templateName), templateVars));
} catch (IOException e) {
// handle
} catch (TemplateException e) {
// handle
}
message.setFrom(getMailFromName() + " <" + getMailFromAddr() + ">");
message.setTo(getMailTo());
if (getCcTo() != null)
message.setCc(getCcTo());
message.setSubject(getSubject());
message.setText(content.toString());
mailSender.send(message);
Вот мой applicationContext.xml:
<bean id="freemarkerMailConfiguration"
class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="/WEB-INF" />
</bean>
<bean id="yourEmailServiceClass" class="YourEmailServiceClass">
<property name="mailSender" ref="mailSender" />
<property name="freemarkerMailConfiguration" ref="freemarkerMailConfiguration" />
<property name="freemarkerTemplate" value="email.ftl" />
<property name="mailFromName" value="John Q. Programmer" />
<property name="mailFromAddr" value="john.q.programmer@mail.com" />
<property name="subject" value="Email Subject" />
</bean>
И ваш вопрос о кэшировании...
Я видел только свойство bean 'cache' в компоненте 'ViewResolver', которое, как вы сказали, вы не будете использовать.
Смотрите также: Глава 14.Интеграция технологий просмотра