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
相关产品推荐
相关产品推荐

