You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BeansWrapper.getDefaultInstance()已过时,如何在FreeMarker中调用java.lang.Math?

在FreeMarker中获取java.lang.Math类(替代过时的BeansWrapper.getDefaultInstance())

由于BeansWrapper.getDefaultInstance()已被标记为过时,推荐使用DefaultObjectWrapperBuilder来实现需求,以下是两种可行方案:

方案一:直接将Math类放入数据模型

在准备FreeMarker数据模型时,直接把java.lang.Math类存入模型,模板即可直接调用其静态方法:

Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
// 完成模板加载路径、编码等基础配置...

Map<String, Object> dataModel = new HashMap<>();
dataModel.put("Math", Math.class); // 存入Math类,模板可调用静态方法
// 同时存入计算所需的X和n
dataModel.put("X", 12345);
dataModel.put("n", 3);

// 加载模板并渲染
Template template = cfg.getTemplate("your-template.ftl");
template.process(dataModel, new OutputStreamWriter(System.out));

模板中直接使用目标表达式:

${X / (Math.pow(10, n))}

方案二:配置全局共享变量

如果希望所有模板都能直接使用Math类,可将其配置为FreeMarker的全局共享变量:

Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
// 基础配置...

// 创建符合当前FreeMarker版本的ObjectWrapper
DefaultObjectWrapperBuilder wrapperBuilder = new DefaultObjectWrapperBuilder(cfg.getVersion());
ObjectWrapper objectWrapper = wrapperBuilder.build();

// 获取静态类模型容器
TemplateHashModel staticModels = objectWrapper.getStaticModels();
// 获取Math类的静态模型
TemplateHashModel mathStaticModel = (TemplateHashModel) staticModels.get("java.lang.Math");

// 将Math设置为全局共享变量
cfg.setSharedVariable("Math", mathStaticModel);

之后所有模板无需单独传入Math类,直接使用Math.pow()等静态方法即可。

内容的提问来源于stack exchange,提问作者Giby Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:15:38