0

FreeMarker を使用して、Spring を使用して電子メールを送信するための html を作成しようとしています。ファイルからテンプレートにアクセスしたくはありませんが、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.

次のコードを Autowire に使用します。

@Autowired
Configuration freeMarkerTemplateEngine;

依存性注入がなければ (つまり、"new Configuration()" を使用してカスタム ローダーを手動で設定する場合)、問題なく動作しますが、ここでは DI に固執したいと思います。

これを行うために定義する必要があるものは他にありますか? 私はこのブログをフォローしましたが、他に何も必要とは言われていません。

4

3 に答える 3

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 に答える