Sunday, February 13, 2011

Getting template text from FreeMarker in Spring app

Hi,

In my Spring app, I'd like to use FreeMarker to generate the text of emails that will be sent by my application. The generated text will never be returned to the view so I don't need to configure a FreeMarker view resolver. The documentation seems to indicate that I should configure a FreeMarkerConfigurationFactoryBean like this

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

Once I have this bean configured how do I actually get the text that is generated for a particular template, with a particular Map of variables. In other words, what code comes after:

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 seems to provide an alternative integration between Spring and FreeMarker which makes retrieving the template text very obvious, but I'd prefer not to add an additional dependency to my app unless it's absolutely necessary.

Also, do I need to add some extra configuration to the FreeMarkerConfigurationFactoryBean to ensure that the templates are cached?

Cheers, Don

  • Something like this should work

    Before the code you provided, initialize:

    MailSender mailSender = new MailSender();
    SimpleMailMessage message = new SimpleMailMessage();
    

    Then, after your code, add:

    StringBuffer content = new StringBuffer();
    
    try {
        content.append(FreeMarkerTemplateUtils.processTemplateIntoString(
            configuration.getTemplate(templateName),templateVars));
    } catch (IOException e) {          
    } catch (TemplateException e) {
    }
    
    message.setFrom(getMailFromName() + " <" + getMailFromAddr() + ">");
    message.setTo(getMailTo());
    if(getCcTo()!=null)
        message.setCc(getCcTo());
    message.setSubject(getSubject());
    message.setText(content.toString());
    
    mailSender.send(message);
    

    Here's my applicationContext.xml:

    <bean id="freemarkerMailConfiguration"   class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
        <property name="templateLoaderPath" value="/WEB-INF"></property>
    </bean>
    <bean id="yourEmailServiceClass" class="YourEmailServiceClass">
        <property name="mailSender" ref="mailSender"></property>
    <property name="freemarkerMailConfiguration" ref="freemarkerMailConfiguration"></property>
    <property name="freemarkerTemplate" value="email.ftl"></property>
    <property name="mailFromName" value="John Q. Programmer"></property>
    <property name="mailFromAddr" value="john.q.programmer@mail.com"></property>
    <property name="subject" value="Email Subject"></property>
    </bean>
    

    And your caching question...

    I've only seen a bean property 'cache' in a 'viewResolver' bean, which you said you won't be using.

    See also: Chapter 14. Integrating view technologies

    Don : Thanks, presumably the variable you've named configuration is the bean I've named freemarkerConfiguration?
    Chris Serra : Yes, in the class we used, the 'configuration' variable is of type 'Configuration'. See my revised post ^^
    Ahmet Alp Balkan : still there is no configuration definition.

0 comments:

Post a Comment