我的网络应用程序使用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
,我会遇到同样的问题。
答案 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函数支持。