gpt4 book ai didi

data-binding - Wicket PropertyModel 奇怪?

转载 作者:行者123 更新时间:2023-12-04 05:10:37 26 4
gpt4 key购买 nike

我是 Wicket 的新手,正在尝试以下配置:

class User {
private String password;

...

public void setPassword(String password) {
this.password = MD5.encode(password);
}
...
}

在尝试使用以下绑定(bind)到密码并发现 PropertyModel 的默认实现是默认绑定(bind)到字段后,而不是属性(奇怪的名字吧?)
add(new PasswordTextField("password", new PropertyModel(user, "password"));

为什么他们会以这种方式实现它?是否有默认使用 getter 和 setter 的 PropertyModel 替代方案?

谢谢?

最佳答案

PropertyModel会做你想做的事。当一个 PropertyModel查询它的值时,它在两个地方查找:

  • 如果给定属性存在“getter”方法,PropertyModel调用 getter 来检索属性的值。具体来说,PropertyModel查找名为 get<Property> 的方法, 其中 <Property>是传递给 PropertyModel 的属性表达式构造函数,如果存在则使用反射调用该方法。
  • 如果不存在“getter”方法,PropertyModel直接返回属性字段的值。具体来说,PropertyModel使用反射查找与传递给 PropertyModel 的属性表达式匹配的字段构造函数。如果找到匹配的字段,PropertyModel返回字段的值。请注意 PropertyModel除了公共(public)字段之外,还将检查私有(private)字段和 protected 字段以进行匹配。

  • 在您的情况下, PropertyModel 中使用的属性表达式构造函数是 "password" ,所以 PropertyModel将首先在 user 上寻找方法名为 getPassword 的对象.如果不存在这样的方法, PropertyModel将返回私有(private) password 的值字段。

    因为在你的情况下 PropertyModel返回私有(private)字段的值而不是调用“getter”,您很可能在 User 中输入错误的 getter 名称类(class)。例如,如果您不小心输入了 getPasssword (带 3 s), PropertyModel找不到它,并将回退到返回私有(private)字段。

    编辑

    如果你不喜欢 PropertyModel的默认行为,您可以创建 PropertyModel 的子类这将阻止 Wicket 尝试读取/写入私有(private)字段。这样,您可以强制通过 getter 和 setter 进行所有属性访问。

    我写了一个例子 BeanPropertyModel类来证明这一点:
    import org.apache.wicket.WicketRuntimeException;
    import org.apache.wicket.model.PropertyModel;

    /**
    * A custom implementation of {@link org.apache.wicket.model.PropertyModel}
    * that can only be bound to properties that have a public getter or setter method.
    *
    * @author mspross
    *
    */
    public class BeanPropertyModel extends PropertyModel {

    public BeanPropertyModel(Object modelObject, String expression) {
    super(modelObject, expression);
    }

    @Override
    public Object getObject() {
    if(getPropertyGetter() == null)
    fail("Missing getter");
    return super.getObject();
    }

    @Override
    public void setObject(Object modelObject) {
    if(getPropertySetter() == null)
    fail("Missing setter");
    super.setObject(modelObject);
    }

    private void fail(String message) {

    throw new WicketRuntimeException(
    String.format("%s. Property expression: '%s', class: '%s'.",
    message,
    getPropertyExpression(),
    getTarget().getClass().getCanonicalName()));
    }
    }

    关于data-binding - Wicket PropertyModel 奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/548354/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com