Spring MVC集成Freemarker 2.3.23:如何指定ObjectWrapper消除警告?
嘿,我之前在Spring MVC搭配Freemarker 2.3.x的时候也遇到过这个警告,折腾了好一阵才搞定。核心问题就是Freemarker需要明确指定ObjectWrapper才能加载自定义EL函数,给你两个可直接运行的配置示例,你根据自己项目的配置风格选就行:
方式一:XML配置(传统Spring MVC项目适用)
如果你的项目还是用XML配置Spring,直接在spring-servlet.xml里添加以下配置:
<!-- Freemarker配置器 --> <bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <!-- 模板文件路径 --> <property name="templateLoaderPath" value="/WEB-INF/templates/"/> <!-- 默认编码 --> <property name="defaultEncoding" value="UTF-8"/> <!-- 关键配置:指定ObjectWrapper,解决自定义EL函数加载警告 --> <property name="freemarkerSettings"> <props> <!-- 推荐用DefaultObjectWrapper(BeansWrapper的子类,支持更多特性) --> <prop key="object_wrapper">freemarker.template.DefaultObjectWrapper</prop> </props> </property> <!-- 注册自定义EL函数:把你的函数类注入为Freemarker变量 --> <property name="freemarkerVariables"> <map> <entry key="myCustomFunc" value-ref="myFreemarkerFunctions"/> </map> </property> </bean> <!-- 自定义EL函数类的Bean --> <bean id="myFreemarkerFunctions" class="com.yourproject.util.MyFreemarkerFunctions"/>
方式二:JavaConfig配置(Spring Boot/注解驱动项目适用)
如果你的项目用注解配置,创建一个Freemarker配置类:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapperBuilder; import freemarker.template.Version; @Configuration public class FreemarkerConfig { @Bean public FreeMarkerConfigurer freeMarkerConfigurer() { FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); configurer.setTemplateLoaderPath("/WEB-INF/templates/"); configurer.setDefaultEncoding("UTF-8"); // 获取Freemarker核心配置实例 Configuration fmConfig = configurer.createConfiguration(); // 严格匹配你的Freemarker版本2.3.23,构建ObjectWrapper Version fmVersion = new Version(2, 3, 23); DefaultObjectWrapperBuilder wrapperBuilder = new DefaultObjectWrapperBuilder(fmVersion); fmConfig.setObjectWrapper(wrapperBuilder.build()); // 注册自定义EL函数 fmConfig.setSharedVariable("myCustomFunc", new MyFreemarkerFunctions()); configurer.setConfiguration(fmConfig); return configurer; } }
自定义EL函数示例
不管用哪种配置,你需要一个自定义函数类,比如:
package com.yourproject.util; public class MyFreemarkerFunctions { // 示例函数:将字符串转为大写 public String toUpperCase(String input) { return input == null ? "" : input.toUpperCase(); } // 可以添加更多自定义函数,比如格式化日期、数值计算等 }
在Freemarker模板中使用
配置完成后,就能在.ftl模板里直接调用自定义函数了:
<p>原始文本:"hello world"</p> <p>转换后:${myCustomFunc.toUpperCase("hello world")}</p>
注意事项
- 确保你的Freemarker版本和配置里指定的版本一致(这里是2.3.23),避免版本兼容问题;
- 自定义函数类需要有公共的无参构造方法,或者通过Spring Bean注入(XML方式里的
value-ref就是用Bean注入); - 如果还是有警告,检查是否配置了多个
FreeMarkerConfigurer,确保只有一个生效。
内容的提问来源于stack exchange,提问作者Roman




