将列表项插值为属性?

时间:2014-10-29 07:25:44

标签: java freemarker

目标:使用Freemarker生成以下格式的Java代码

public void save(){
    helper.save();
}

public void load(){
    helper.load();
}

//Other such lifecycle methods

基本上,我有一小部分"生命周期"方法名称,我想为每个方法生成代码。但是,如果传入的模型对象需要它,我只生成一个方法。我的模型类看起来像:

public class Model{
    private boolean load;
    private boolean save;
    //bools for other lifecycle methods

    public Model(boolean load, boolean save){
        this.load = load;
        this.save = save;
    }

    public boolean getLoad(){
        return load;
    }

    public boolean getSave(){
        return save;
    }
}

我的自由标记模板:

<#assign methodNames = ["load", "save"]>
<#list methodNames as method>
<#if model.method>
public void ${method}(){
    helper.${method}();
}
</#if>
</#list>

但是,<#if>语句不起作用。 Freemarker抱怨model.methodnull。看起来Freemarker正在我的模型中寻找getMethod(),而不是将model解析为saveload,然后寻找getSave()或{{1} }。

我尝试了以下内容,但在所有情况下,Freemarker都抱怨一个语法错误或另一个:

getLoad()

此操作失败,并显示错误消息,指出我<#assign methodNames = ["load", "save"]> <#list methodNames as method> <#assign methodRequired = r"model.${method}"> <#if <@methodRequired?interpret>> public void ${method}(){ helper.${method}(); } </#if> </#list> 内无法<@methodRequired>。我也直接尝试<#if>,但这显然不起作用。

为了完整起见,我在这里调用模板:

<#if model.${method}>

所以,问题是 - 如何让Freemarker从另一个模型对象中向我提供列表变量的值?

1 个答案:

答案 0 :(得分:1)

它与其他典型语言非常相似:model[method]model.method实际上是model["method"]的简写。你也可以写model["foo" + someVar]之类的东西,所以它是someContainer[someKeyExpression]