我是Wicket的新手,正在尝试以下配置:
class User {
private String password;
...
public void setPassword(String password) {
this.password = MD5.encode(password);
}
...
}
尝试使用以下命令绑定密码并发现默认情况下PropertyModel的默认实现绑定到字段,而不是属性(奇怪的名称是呃?)
add(new PasswordTextField("password", new PropertyModel(user, "password"));
为什么世界上他们会以这种方式实施它?是否存在默认使用getter和setter的PropertyModel替代方法?
谢谢?
答案 0 :(得分:11)
PropertyModel
会做你想要的。当查询PropertyModel
的值时,它会在两个位置查找:
如果给定属性存在“getter”方法,则PropertyModel
会调用getter来检索属性的值。具体来说,PropertyModel
查找名为get<Property>
的方法,其中<Property>
是传递给PropertyModel
构造函数的属性表达式,如果存在,则使用反射调用该方法。 / p>
如果不存在“getter”方法,PropertyModel
将直接返回属性字段的值。具体来说,PropertyModel
使用反射查找与传递给PropertyModel
构造函数的属性表达式匹配的字段。如果找到匹配的字段,PropertyModel
将返回字段的值。请注意,PropertyModel
除了匹配的公共字段外,还会检查私有字段和受保护字段。
在您的情况下,PropertyModel
构造函数中使用的属性表达式为"password"
,因此PropertyModel
将首先在名为{{user
的对象上查找方法1}}。如果不存在此类方法,getPassword
将返回私有PropertyModel
字段的值。
因为在你的情况下password
返回私有字段的值而不是调用“getter”,所以你很可能错误地输入了PropertyModel
类中getter的名字。例如,如果您不小心输入了User
(3 s),getPasssword
将无法找到它,并且会回退到私有字段。
修改强>
如果您不喜欢PropertyModel
的默认行为,则可以创建PropertyModel
的子类,以防止Wicket尝试读/写私有字段。这样,您可以通过getter和setter强制所有属性访问。
我写了一个示例PropertyModel
类来演示这个:
BeanPropertyModel
答案 1 :(得分:3)
在这种情况下,我不会使用属性模型。写一下
new Model<String>(){ getObject(){...} setObject(){...}}
并实现正确的行为,这正是你想要的。