Freemarker - 仅对豆类使用getter

时间:2016-09-28 12:34:22

标签: java spring freemarker

我的实体中有一些构建器函数,freemarker无法处理。

例如,我有以下bean / entity:

public class User{

    private Long number;

    public Long getNumber(){
        return this.number;
    }

    public void setNumber(Long number){
        this.number = number;
    }

    public User number(Long number){
        this.number = number;
    }
}

我的freemarker模板是这样的:

<span>${user.number}</span>

我按照以下方式处理:

User user = getUser();
Map<String, Object> context = new HashMap<>();
contaxt.put("user", user);
Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
configuration.setObjectWrapper(new BeansWrapper(Configuration.VERSION_2_3_0));
Template t = new Template("usertpl", template, configuration);
String result = FreeMarkerTemplateUtils.processTemplateIntoString(t, model);

由于我的实体包含一个方法&#34; number(Long)&#34;,freemarker尝试使用它,这实际上是一个setter - 所以它不起作用。

我知道,我可以在模板中使用getter,但模板应该由用户定义(对于那些不是程序员的人,我认为${user.number}${user.getNumber()}更容易理解)< / p>

所以,我正在寻找另一种解决方案......

是否有可能配置freemarker以便它只使用getter(getNumber())来访问该属性,而不是使用number(Long)

1 个答案:

答案 0 :(得分:3)

您可以使用BeansWrapper配置setMethodAppearanceFineTuner。为了草率的复制贴纸,我将在这里使用构建器而不是newDefaultObjectWrapper而不是BeansWrapper,而VERSION_2_3_25而不是VERSION_2_3_0,但这也适用于您的设置:

DefaultObjectWrapperBuilder owb = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25);
owb.setMethodAppearanceFineTuner(new MethodAppearanceFineTuner() {
    @Override
    public void process(MethodAppearanceDecisionInput in, MethodAppearanceDecision out) {
        out.setMethodShadowsProperty(false);
    }
});
cfg.setObjectWrapper(owb.build());

截至JavaDoc中的“实验性”免责声明,不用担心,这些将在2.3.26中留下实验状态。