0

我正在尝试使用 FreeMarker 创建 html 以使用 Spring 发送电子邮件。我不想从文件中访问模板,而是从数据库中获取它(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"/>

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

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。

为了做到这一点,我还需要定义什么吗?我已经关注了这个博客,它没有说需要其他任何东西。

4

3 回答 3

1

嗯,我想通了。

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

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

现在可以了!

于 2013-10-13T10:45:13.427 回答
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;
}
于 2014-11-14T12:24:53.040 回答
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;
于 2015-02-24T04:49:39.513 回答