2008-10-23 24 views
18

En mi aplicación Spring, me gustaría utilizar FreeMarker para generar el texto de los correos electrónicos que mi aplicación enviará. El texto generado nunca se devolverá a la vista, por lo que no es necesario configurar una resolución de vista de FreeMarker. La documentación parece indicar que debería configurar un FreeMarkerConfigurationFactoryBean como estoObtener texto de plantilla de FreeMarker en la aplicación Spring

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

Una vez que tengo este bean configurado ¿cómo lo consigo realmente el texto que se genera para una plantilla determinada, con un mapa en particular de variables. En otras palabras, lo que se produce después de código:

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 parece proporcionar una integración alternativa entre la primavera y el FreeMarker que hace recuperar el texto de la plantilla muy obvio, pero prefiero no añadir una dependencia adicional para mi aplicación a menos que sea absolutamente necesario.

Además, ¿necesito agregar alguna configuración adicional a FreeMarkerConfigurationFactoryBean para garantizar que las plantillas estén en caché?

Saludos, Don

Respuesta

22

Algo como esto debería funcionar

Antes de que el código que ya ha proporcionado, inicializar:

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

Entonces, después de su código, añadir:

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); 

Aquí está mi 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="[email protected]" /> 
    <property name="subject" value="Email Subject" /> 
</bean> 

y su pregunta de almacenamiento en caché ...

Sólo he visto un grano de propiedad 'caché' en un grano 'ViewResolver', lo que usted ha dicho que no va a utilizar.

Consulte también: Chapter 14. Integrating view technologies

+0

Gracias, presumiblemente, la variable que ha nombrado configuración es el grano que he nombrado freemarkerConfiguration? –

+0

Sí, en la clase que usamos, la variable 'configuración' es de tipo 'Configuración'. Ver mi publicación revisada ^^ –

+0

todavía no hay definición de configuración. –

Cuestiones relacionadas