【问题标题】:Getting template text from FreeMarker in Spring app在 Spring 应用程序中从 FreeMarker 获取模板文本
【发布时间】: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 添加一些额外的配置以确保模板被缓存?

干杯, 唐

【问题讨论】:

    标签: java spring templates freemarker


    【解决方案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();。否则效果很好,谢谢。
    猜你喜欢
    • 2011-04-28
    • 2011-01-18
    • 2013-02-24
    • 2010-11-17
    • 2012-07-02
    • 2019-10-21
    • 2011-05-22
    • 2021-10-13
    相关资源
    最近更新 更多