Wicket PropertyModel陌生?

时间:2009-02-14 02:21:35

标签: data-binding wicket

我是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替代方法?

谢谢?

2 个答案:

答案 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(){...}}

并实现正确的行为,这正是你想要的。