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

旧时模样 提交于 2020-01-06 03:14:22

问题


My web-application uses Spring MVC and Freemarker. When it must first render a web page (using Freemarker 2.3.22) after starting up, it logs a warning message:

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

(Yes, ObjectWarpper; the error message has typo)

However, I think I do have an ObjectWrapper specified in my configuration bean:

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

So what must I do to correctly set up an ObjectWrapper and prevent this warning message being logged?

I have the same problem if I use a default object_wrapper.


回答1:


This problem also bothered me, I checked the source code of the org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer class and found the taglibFactory inited without ObjectWrapper being set.

So I extend the FreeMarkerConfigurer class and override the getTaglibFactory() method and replace the spring mvc config. Here is my code:

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



回答2:


The TagLibFactory doesn't start out with an Objectwrapper. This seems to work:

@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;
    }
    ...
}



回答3:


That warning message means that no ObjectWrapper was specified to the freemarker.ext.jsp.TaglibFactory. Certainty Spring instantiates TaglibFactory itself, but doesn't call TaglibFactory.setObjectWrapper, which was only added in FreeMarker 2.3.22, together with the EL function support.



来源:https://stackoverflow.com/questions/33891693/custom-el-functions-wont-be-loaded-because-no-objectwarpper-was-specified

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!