使用Spring为FreeMarker定义自定义模板加载器

时间:2013-10-13 08:23:26

标签: spring exception configuration freemarker

我正在尝试使用FreeMarker创建html,以便使用Spring发送电子邮件。我不想从文件访问模板,而是从db(Mongo,但任何数据库都是相同的)获取它。 我目前的配置如下:

<!-- freemarker config -->
<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
   <property name="preTemplateLoaders">
       <list>
           <ref bean="databaseTemplateLoader"/>
       </list>
   </property>
</bean>
<bean name="databaseTemplateLoader" class="com.myapp.service.MongoDBToFreeMarkerTemplateLoader"/>

当我自动装配Configuration对象时,我得到以下异常:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [freemarker.template.Configuration] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.

我使用以下代码进行自动装配:

@Autowired
Configuration freeMarkerTemplateEngine;

没有依赖注入(即使用“new Configuration()”并手动设置自定义加载器),它工作正常,但显然我想在这里坚持DI。

为了做到这一点,还有什么我需要定义的吗?我跟着this blog并没有说其他任何需要。

3 个答案:

答案 0 :(得分:1)

好吧,我明白了。

事实证明,这里存在两个问题:

  1. 我将工厂bean配置放在spring-servlet.xml中,旁边是 freemarkerViewResolver可能使它可用于 查看解析器,但对应用程序的其余部分不可见。移动 这个配置到applicationcontext.xml是解决这个问题的第一步 问题。
  2. 我有一个Maven配置错误。当我添加FreeMarker时 我的POM.XML文件,我没有设置范围。默认范围是 编译,这意味着Configuration类不可用 在运行时。将运行时添加到freemarker maven 包括修复那个。
  3. 它现在有效!

答案 1 :(得分:0)

能够将Spring的标签库与自定义模板加载器一起使用

<#import "spring.ftl" as spring />

您需要执行以下操作(使用Java配置):

public FreeMarkerConfigurer getFreemarkerConfig(DBTemplateLoader dbTemplateLoader) throws IOException, TemplateException {

    FreeMarkerConfigurationFactoryBean freeMarkerConfigurationFactoryBean = new FreeMarkerConfigurationFactoryBean();

    freeMarkerConfigurationFactoryBean.setPreTemplateLoaders(new ClassTemplateLoader(FreeMarkerConfigurer.class, ""), dbTemplateLoader);

    FreeMarkerConfigurer result = new FreeMarkerConfigurer();

    result.setConfiguration(freeMarkerConfigurationFactoryBean.createConfiguration());

    return result;
}

答案 2 :(得分:0)

我相信这是因为Spring找不到applicationContext中定义的匹配bean。

由于您定义了freemarker配置bean,如下所示:

<!-- freemarker config -->
<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="preTemplateLoaders">
   <list>
       <ref bean="databaseTemplateLoader"/>
   </list>
</property>
</bean>
<bean name="databaseTemplateLoader" class="com.myapp.service.MongoDBToFreeMarkerTemplateLoader"/>

然后在你的代码中,你应该注入名为freemarkerConfiguration的bean,如下所示:

@Autowired
FreeMarkerConfigurationFactoryBean freemarkerConfiguration;