2013-10-13 41 views
0

我試圖使用的FreeMarker來發送使用Spring電子郵件創建HTML。我不想從文件訪問模板,而是從數據庫獲取它(Mongo,但任何數據庫都是相同的)。 我現在的配置如下:定義FreeMarker的自定義模板裝載機春天

<!-- 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; 

無依賴注入(即當使用「新的配置()」和手動設置自定義加載程序),它工作正常,但顯然我想堅持到DI在這裏。

還有什麼我需要爲了做到這一點來定義?我遵循this blog,它沒有說任何其他的東西是必要的。

+0

通過什麼Auto需要'Configuration'在這裏連線? – ddekany

+0

爲了使用模板引擎,我需要訪問其「配置」對象,以便我可以調用freeMarkerTemplateEngine.getTemplate(templateName); – TheZuck

+0

如果有更好的方法來做到這一點,請分享,我接受建議 – TheZuck

回答

1

好吧,我想通了。

事實證明,有兩個問題在這裏:

  1. 我把彈簧servlet.xml中的工廠bean的配置,旁邊 的freemarkerViewResolver這可能使它提供給 視圖解析器,但對其他應用程序不可見。將 這個配置移到applicationcontext.xml是解決這個 問題的第一步。
  2. 我有一個Maven的錯誤配置。當我添加FreeMarker到 我的POM.XML文件時,我沒有設置範圍。默認範圍是 編制,這意味着配置類是不能在運行時可用 。將運行時添加到freemarker maven 包括修復該問題。

現在的作品!

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; 
} 
0

我相信這是因爲春季不能找到你的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如下豆:

@Autowired 
FreeMarkerConfigurationFactoryBean freemarkerConfiguration;