我正在尝试使用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并没有说其他任何需要。
答案 0 :(得分:1)
好吧,我明白了。
事实证明,这里存在两个问题:
它现在有效!
答案 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;