You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动