我有一个简单的课程:
public class MyClass {
public final static long MAIN = 1;
@Setter @Getter
protected int id;
}
(@Setter
@Getter
是Setter和Getter方法的lombok
注释。)
在Freemarker模板中,我想创建一个类似的条件:
<#if myClassInstance.id == myClassInstance.MAIN>
但是if
表达式的右侧是根据FreeMarker未定义的。有没有办法做到这一点?谢谢!
答案 0 :(得分:2)
模板语言不了解Java类。但是您可以通过数据模型(模板上下文)公开静态成员。请参阅:http://freemarker.org/docs/pgui_misc_beanwrapper.html#autoid_55
答案 1 :(得分:2)
我知道这个问题已经有了一个可接受的答案,但我仍在编写一些代码,可以为其他人提供帮助。
使用java下面的代码
BeansWrapper w = new BeansWrapper();
TemplateModel statics = w.getStaticModels();
map.put("statics", statics); // map is java.util.Map
template.process(map, out); // template is freemarker.template.Template
然后在ftl中访问常量
${statics["com.model.to.gen.Common"].FLAG_YES}
此处 com.model.to.gen.Common 是一个类, FLAG_YES 是一个静态常量。
答案 2 :(得分:0)
您可以使用公开字段选项。因此,您可以使用没有访问器的数据模型(getter / setter)。
BeansWrapperBuilder wrapperBuilder = new BeansWrapperBuilder(Configuration.VERSION_2_3_23);
wrapperBuilder.setExposeFields(true);
Template template = freemarkerConfiguration.getTemplate("mytemplatefile.ftl");
StringWriter stringWriter = new StringWriter();
template.process(model, stringWriter, wrapperBuilder.build());
System.out.println(stringWriter.toString());
答案 3 :(得分:0)
我还有另一种类似但有效的方法。
首先,我们可以创建一个这样的util类:
/**
* FreeMarker Utils.
*
* @author Eric Chan
*/
public abstract class FreeMarkerUtils {
/**
* init for static classes and fields.
*
* @param model model
*/
public static void initStatics(final Model model) {
// you can also create the Version like: new Version("2.3.27");
BeansWrapper wrapper = new BeansWrapper(new Version(2, 3, 27));
TemplateModel statics = wrapper.getStaticModels();
model.addAttribute("statics", statics);
}
}
然后,在您的Controller
中调用它:
FreeMarkerUtils.initStatics(model);
仅此而已,现在您可以像这样访问.ftl
中的静态变量:
${statics["com.springboot.constants.TestConstants"].NAME}