Freemarker - 只对 bean 使用 getter
Freemarker - only use getter for beans
我的实体中有一些生成器函数,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);
因为我的实体包含一个方法 "number(Long)",freemarker 尝试使用它,它实际上是一个 setter - 所以它不工作。
我知道,我可以在模板中使用 getter,但模板应该由用户定义(我认为 ${user.number}
比 ${user.getNumber()}
更容易理解谁不是程序员)
所以,我正在寻找另一种解决方案...
是否可以配置 freemarker,使其只使用 getter (getNumber()
) 来访问 属性,而不是使用 number(Long)
?
您可以像 setMethodAppearanceFineTuner
那样配置 BeansWrapper
。为了匆忙复制粘贴,我将在这里使用构建器而不是new
,DefaultObjectWrapper
而不是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 中的 "experimental" 免责声明,不用担心,这些将在 2.3.26 中保留实验状态。
我的实体中有一些生成器函数,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);
因为我的实体包含一个方法 "number(Long)",freemarker 尝试使用它,它实际上是一个 setter - 所以它不工作。
我知道,我可以在模板中使用 getter,但模板应该由用户定义(我认为 ${user.number}
比 ${user.getNumber()}
更容易理解谁不是程序员)
所以,我正在寻找另一种解决方案...
是否可以配置 freemarker,使其只使用 getter (getNumber()
) 来访问 属性,而不是使用 number(Long)
?
您可以像 setMethodAppearanceFineTuner
那样配置 BeansWrapper
。为了匆忙复制粘贴,我将在这里使用构建器而不是new
,DefaultObjectWrapper
而不是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 中的 "experimental" 免责声明,不用担心,这些将在 2.3.26 中保留实验状态。