由于未指定ObjectWarpper,因此无法加载自定义EL函数

时间:2015-11-24 10:54:21

标签: spring-mvc freemarker

我的网络应用程序使用Spring MVC和Freemarker。在启动后必须首先呈现网页(使用Freemarker 2.3.22)时,它会记录一条警告消息:

 Custom EL functions won't be loaded because no ObjectWarpper was specified

(是的,ObjectWarpper;错误消息有拼写错误)

但是,我认为我在我的配置bean中指定了ObjectWrapper

 <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="/WEB-INF/views/" />
    <property name="freemarkerSettings">
       <props>
          <prop key="url_escaping_charset">UTF-8</prop>
          <prop key="object_wrapper">DefaultObjectWrapper(2.3.22)</prop>
       </props>
    </property>
 </bean>

那么我该怎样做才能正确设置ObjectWrapper并防止记录此警告消息?

如果我使用default object_wrapper,我会遇到同样的问题。

3 个答案:

答案 0 :(得分:6)

这个问题也困扰我,我检查了org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer类的源代码,发现taglibFactory没有设置ObjectWrapper。

所以我扩展FreeMarkerConfigurer类并覆盖getTaglibFactory()方法并替换spring mvc config。这是我的代码:

public class DefaultFreeMarkerConfigurer extends FreeMarkerConfigurer {
    @Override
    public TaglibFactory getTaglibFactory() {
        TaglibFactory tagLibFactory = super.getTaglibFactory();
        if (tagLibFactory.getObjectWrapper()==null) {
            tagLibFactory.setObjectWrapper(super.getConfiguration().getObjectWrapper());
        }
        return tagLibFactory;
    }
}

答案 1 :(得分:4)

TagLibFactory并非以Objectwrapper开头。这似乎有效:

@Configuration
public class CustomFreemarkerConfiguration extends WebMvcConfigurerAdapter {
    ...
    @Bean
    @Autowired
    public TaglibFactory taglibFactory(ServletContext servletContext) throws IOException, TemplateException {
        FreeMarkerConfigurer freemarkerConfig = configFreeMarkerConfigurer(servletContext);

        TaglibFactory taglibFactory = freemarkerConfig.getTaglibFactory();
        taglibFactory.setObjectWrapper(freemarker.template.Configuration.getDefaultObjectWrapper(freemarker.template.Configuration.getVersion()));

        return taglibFactory;
    }
    ...
}

答案 2 :(得分:1)

该警告消息表示没有为ObjectWrapper指定freemarker.ext.jsp.TaglibFactory。确定性Spring实例化TaglibFactory本身,但不会调用TaglibFactory.setObjectWrapper,它只是在FreeMarker 2.3.22中添加,以及EL函数支持。