Nonostante ci siano molte discussioni intorno a freemarker + spring, è difficile trovare un esempio operativo pulito da copiare ed eseguire.
Potresti fornire la configurazione di lavoro più semplice di freemarker in spring xml context e snippet di codice java per caricare template da file di risorse ed elaborarlo.freemarker + configurazione a molla ed esempio più semplice
risposta
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
applicationContext.xml
<bean id="freeMarkerConfigurationFactory" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="classpath:/META-INF/freemarker"/>
<property name="preferFileSystemAccess" value="false"/>
</bean>
AlertMailComposer.java
import static org.springframework.ui.freemarker.FreeMarkerTemplateUtils.processTemplateIntoString;
@Component
public class AlertMailComposer implements Processor {
public static final String TEMPLATE = "AlertMail.ftl";
@Autowired
private Configuration freemarkerConfiguration;
protected String composeHtml(Alert alert) throws IOException, TemplateException {
return processTemplateIntoString(freemarkerConfiguration.getTemplate(TEMPLATE), ImmutableMap.of(
"alertType", alert.getAlertType(),
"message", alert.getMessage(),
"nodeName", alert.getEvent().getNodeName(),
"event", toJson(alert.getEvent(), true)
));
}
...
AlertMail.ftl
<html>
<body style="font-family:verdana;font-size:10">
<b>${alertType}: </b>${message}<br>
<b>on: </b>${nodeName}<br>
<p/>
<pre style="font-family:verdana;font-size:10;color:grey">
${event}
</pre>
</body>
</html>
Il miglior esempio operativo. È possibile scaricare il codice sorgente here.
Grazie per la tua risposta, ho già lavorato su questo blog ed è buono. Ma è strettamente legato al layout del progetto web. Quello che sto cercando è 'caricare template da risorse e sostituti placehoder' il più semplice possibile. –
Nel contesto xml primavera, dichiarando FreemarkerConfigurationFactoryBean
è sufficiente, vale a dire
<bean id="freemarkerConfigFactory" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="classpath:templates/"/>
</bean>
Non c'è bisogno di specificare ulteriormente freemarker.template.Configuration
fagiolo nel file XML se si utilizza @Autowired
annotazione. Viene creato dalla fabbrica e iniettato da Spring.
Altro che dipendenza Maven in pom.xml di utilizzarlo con la configurazione java in primavera si può fare -
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { MyRootContextConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { MyServletContextConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/test/*" };
}
}
e poi MyRootContextConfig
può avere
@Bean(name = "myFreeMarkerConfigruation")
public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() {
FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
bean.setTemplateLoaderPath("classpath:/templates/");
return bean;
}
Questo esempio è usando config java-based e sta ancora usando un progetto web, ma questo è quello che faccio riferimento: https://github.com/edendramis/freemarker-example – ratherblue