1
<bean id="beansWrapper" class="freemarker.ext.beans.BeansWrapper">
<property name="exposeFields" value="true" />
</bean>

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freema rker.FreeMarkerConfigurer">
<property name="objectWrapper">
<ref local="beansWrapper" />
</property>
<property name="templateLoaderPath">
<value>/WEB-INF/views/</value>
</property>
</bean>

それは機能しません。例外が発生します。

org.springframework.beans.NotWritablePropertyException: Bean クラス [org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer] の無効なプロパティ 'objectWrapper': Bean プロパティ 'objectWrapper' は書き込み可能ではないか、無効な設定メソッドがあります。セッターのパラメーターの型は、ゲッターの戻り値の型と一致していますか?

setObjectWrapper には ObjectWrapper のインスタンスが必要です。この構成で渡すと思っていました。


返信からのアドバイスに基づいて(質問を編集するときに表示されないため、帰属がなくて申し訳ありません)、これを試しました:

<bean id="beansWrapper" class="freemarker.ext.beans.BeansWrapper">
    <property name="exposeFields" value="true" />
</bean> 

<bean id="freemarkerAppConfig" class="freemarker.template.Configuration">
    <property name="objectWrapper">
        <ref local="beansWrapper"/>
    </property>
</bean>

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
   <property name="configuration">
       <ref local="freemarkerAppConfig" />
   </property>
    <property name="templateLoaderPath">
        <value>/WEB-INF/views/</value>
    </property>
</bean>

しかし、これはまだうまくいきません。私が間違っていなければ、setConfiguration を呼び出すことにより、FreeMarkerConfigurer の他のすべてのプロパティは、提供された構成によってオーバーライドされます。

残念ながら、構成 Bean は文字列ではなく Dir オブジェクトを想定しているため、テンプレートの読み込みパスを簡単に設定する方法がわかりません。

4

1 に答える 1

3

Spring のドキュメントをさらに読むと、次の方法がわかりました。

<bean id="beansWrapper" class="freemarker.ext.beans.BeansWrapper">
    <property name="directoryForTemplateLoading" value="WEB-INF/views/" />
    <property name="exposeFields" value="true" />
</bean> 

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
   <property name="freemarkerVariables">
       <map>
           <entry key="objectWrapper" value-ref="beansWrapper" />
       </map>
   </property>
    <property name="templateLoaderPath">
        <value>/WEB-INF/views/</value>
    </property>
</bean>

不思議に思っている人のために説明すると、これは、FreeMarker が getter と setter を必要とせずにオブジェクトのパブリック プロパティにアクセスできるようにするために行われます。Java ではコーシャではないかもしれませんが、これは Groovy との相性が良くなりました。

于 2012-08-07T01:14:06.600 に答える