Obtención de texto de plantilla de FreeMarker en la aplicación Spring
-
04-07-2019 - |
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
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