Pregunta

En mi aplicación Spring, me gustaría usar FreeMarker para generar el texto de los correos electrónicos que serán enviados por mi aplicación. El texto generado nunca volverá a la vista, por lo que no necesito configurar un solucionador de vista FreeMarker. La documentación parece indicar que debo configurar un FreeMarkerConfigurationFactoryBean como este

<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 obtengo el texto que se genera para una plantilla en particular, con un mapa de variables en particular? En otras palabras, qué código viene después:

String templateName = "email"
Map templateVars = new HashMap();
templateVars.put("firstName", "john");
templateVars.put("surname", "doe");    
// Now how do I get the template text?

Módulos Spring parece proporcionar una integración alternativa entre Spring y FreeMarker que hace que la recuperación del texto de la plantilla sea muy obvio, pero preferiría no agregar una dependencia adicional a mi aplicación a menos que sea absolutamente necesario.

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

Saludos, Don

¿Fue útil?

Solución

Algo como esto debería funcionar

Antes del código que proporcionó, inicialice:

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

Luego, después de su código, agregue:

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 aplicaciónContext.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>

Y tu pregunta de almacenamiento en caché ...

Solo he visto un 'caché' de propiedades de bean en un bean 'viewResolver', que dijiste que no estarías usando.

Consulte también: Capítulo 14. Integración de tecnologías de visualización

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top