来自数据库的带有 Freemarker 模板的 Spring Mail

Posted

技术标签:

【中文标题】来自数据库的带有 Freemarker 模板的 Spring Mail【英文标题】:Spring Mail with Freemarker Templates from Database 【发布时间】:2018-04-06 22:44:40 【问题描述】:

我是将 Freemarker 添加到 Spring 和 Spring Mail 的新手。我没有使用 Spring Boot,但我使用的是最新的 Spring 4.x,虽然我们有一个应用程序上下文 XML 文件,但我们确实使用了注解。

所以,最终我想从数据库中读取模板,因为我们可能为许多客户提供了许多模板。我们不会从文件名或磁盘加载模板。

我们的 Spring 应用程序是一个 Maven 多模块项目:

entity.jar - module
dao.jar - module
services.jar - module
ws.jar - module

在服务下,我们有一个应用上下文文件,它定义 Freemarker 如下:

 <bean id="freemarkerConfiguration"
        class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
        <property name="preTemplateLoaders">
            <list>
                <ref bean="databaseTemplateLoader" />
            </list>
        </property>
      </bean>

      <bean name="databaseTemplateLoader" 
       class="com.myapp.server.util.DatabaseToFreeMarkerTemplateLoader" />

我有一个新的类叫做:

  public class DatabaseToFreeMarkerTemplateLoader extends StringTemplateLoader
     
        // todo: add code here
     

但我不确定这里还需要什么。我在网上找了一些例子,但找不到太多。

如果有人可以给我举个例子,或者让我参考这里的另一个链接,我会尽我所能,看看我是否能从字面上填空。

谢谢!

顺便说一句:我很惊讶我必须在我的服务层中包含 spring-web 才能完成这项工作。我只是想格式化电子邮件而不是 html 页面。因此,如果有更好的格式化工具可以与 Spring 无缝协作,请告诉我。

【问题讨论】:

【参考方案1】:

我不太了解 Spring 的这一部分,但我认为您不需要 spring-web。您可以直接使用 FreeMarker API 进行配置(即创建 freemarker.template.Configuration 单例 bean)和生成输出(template = configuration.getTemplate(...)template.process(...))。最后,您只需使用message.setText(theOutputFromTemplateDotProcess, true);(其中message 是Spring MimeMessageHelper)。所以我相信这里没有太多可以与 Spring 集成的东西。 (即使有人需要从 Spring 资源加载模板,他们也可以通过 Configuration.setTemplateLoader 使用 org.springframework.ui.freemarker.SpringTemplateLoader。)

至于直接使用 FreeMarker API(与 Spring 无关),请参见此示例:http://freemarker.org/docs/pgui_quickstart_all.html

【讨论】:

以上是关于来自数据库的带有 Freemarker 模板的 Spring Mail的主要内容,如果未能解决你的问题,请参考以下文章

使用 <@s.generator 和迭代器标签时出现“Freemarker 模板错误”

无法读取 freemarker 模板

列出 Freemarker 模板中的所有变量

如何处理 Freemarker 字符串模板?

freeMarker

带有 freemarker 和 spring 的 Liferay portlet