【问题标题】:Configure a BeanWrapper for FreeMarker in Spring Web在 Spring Web 中为 FreeMarker 配置一个 BeanWrapper
【发布时间】:2012-08-03 00:39:03
【问题描述】:
<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.Fr eeMarkerConfigurer] 的无效属性“objectWrapper”:bean 属性“objectWrapper”不可写或具有无效的设置器方法。 setter的参数类型和getter的返回类型是否匹配?

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 对象,而不是字符串。

【问题讨论】:

  • 错误信息的原因是FreeMarkerConfigurer没有setObjectWrapper方法。 freemarker.template.Configuration 有,但我不确定访问该对象的 Springish 方式是什么。
  • 我不认为这是完全正确的。
  • 嗨,我按回车并没有完成我的想法。我已经编辑了我的问题以指出一个新问题。

标签: spring freemarker


【解决方案1】:

更多阅读 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 中可能不是 kosher,但现在这与 Groovy 配合得更好。

【讨论】:

    猜你喜欢
    • 2011-05-22
    • 2016-10-13
    • 2014-05-21
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2018-05-16
    • 2017-12-26
    相关资源
    最近更新 更多