在 Spring 应用程序中从 FreeMarker 获取模板文本

Posted

技术标签:

【中文标题】在 Spring 应用程序中从 FreeMarker 获取模板文本【英文标题】:Getting template text from FreeMarker in Spring app 【发布时间】:2010-09-18 20:21:39 【问题描述】:

在我的 Spring 应用程序中,我想使用 FreeMarker 生成将由我的应用程序发送的电子邮件文本。生成的文本将永远不会返回到视图,因此我不需要配置 FreeMarker 视图解析器。文档似乎表明我应该像这样配置 FreeMarkerConfigurationFactoryBean

<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
   <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
</bean>

一旦我配置了这个 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 modules 似乎提供了 Spring 和 FreeMarker 之间的替代集成,这使得检索模板文本非常明显,但除非绝对必要,否则我不希望向我的应用程序添加额外的依赖项。

另外,我是否需要向 FreeMarkerConfigurationFactoryBean 添加一些额外的配置以确保模板被缓存?

干杯, 唐

【问题讨论】:

【参考方案1】:

这样的东西应该可以工作

在你提供的代码之前,初始化:

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>

还有你的缓存问题...

我只在“viewResolver”bean 中看到了一个 bean 属性“cache”,你说你不会使用它。

另请参阅:Chapter 14. Integrating view technologies

【讨论】:

谢谢,大概你命名的变量配置是我命名为freemarkerConfiguration的bean? 是的,在我们使用的类中,“配置”变量的类型为“配置”。请参阅我修改后的帖子^^ 仍然没有配置定义。 应该是MailSender mailSender = new JavaMailSenderImpl();。否则效果很好,谢谢。

以上是关于在 Spring 应用程序中从 FreeMarker 获取模板文本的主要内容,如果未能解决你的问题,请参考以下文章

在 Kotlin 中从 Spring 配置创建列表映射

无法在 spring-boot 应用程序中从 Consul 读取配置

如何在 Spring Boot 中从 Azure SAML 2.0 应用程序获取角色或组

我可以在 spring 应用程序上下文中从 jpa 获取 jdbc 数据源吗?

如何在我的 Spring Boot 应用程序中从 AWS 访问环境变量

在 Eclipse 中从 Spring:boot 项目创建 war 文件