Question

Je suis nouveau à Wicket et cherchait la configuration suivante:

class User {
   private String password;

   ...

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

Après avoir essayé d'utiliser ce qui suit pour se lier au mot de passe et savoir que la mise en œuvre par défaut de PropertyModel est par défaut lié au champ, et non pas la propriété (nom bizarre hein?)

add(new PasswordTextField("password", new PropertyModel(user, "password"));

Pourquoi dans le monde auraient-ils mis en œuvre cette façon? Et est-il une alternative PropertyModel qui utilise getter et setters par défaut?

Merci

Était-ce utile?

La solution

PropertyModel fera ce que vous voulez déjà. Lorsqu'un PropertyModel est interrogé pour sa valeur, il semble en deux endroits:

  • Si une méthode « getter » existe pour la propriété donnée, le PropertyModel appelle le getter pour récupérer la valeur de la propriété. Plus précisément, le PropertyModel cherche une méthode nommée get<Property>, où <Property> est l'expression de propriété a été transférée au constructeur de PropertyModel, et appelle la méthode utilisant la réflexion si elle existe.

  • Si aucune méthode « getter » existe, la PropertyModel renvoie la valeur du champ du bien. Plus précisément, le PropertyModel utilise la réflexion trouve un champ qui correspond à l'expression de propriété a été transférée au constructeur de PropertyModel. Si un champ correspondant est trouvé, le PropertyModel retourne la valeur du champ. Notez que le PropertyModel vérifiera les champs privés et protégés en plus des champs publics pour un match.

Dans votre cas, l'expression de propriété utilisée dans le constructeur de PropertyModel est "password", de sorte que le PropertyModel d'abord chercher une méthode sur l'objet user appelé getPassword. Si aucune méthode existe, la PropertyModel renvoie la valeur du champ password privé à la place.

Comme dans votre cas, le PropertyModel retourne la valeur du champ privé au lieu d'appeler le « getter », vous avez probablement saisi le nom du getter dans votre classe User. Par exemple, le getPasssword ne trouvera pas f vous PropertyModel accidentellement saisi (avec 3 s de) pour, elle, et REPLI de retourner le champ privé.


EDIT

Si vous ne voulez pas le comportement par défaut de PropertyModel, vous pouvez créer une sous-classe de PropertyModel qui empêchera Wicket d'essayer de lire / écrire dans des champs privés. De cette façon, vous pouvez forcer tous les biens accès à se produire à travers des accesseurs.

J'ai écrit une classe exemple BeanPropertyModel pour démontrer ceci:

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()));
    }
}

Autres conseils

grande réponse par Mike Spross! un petit ajout que:

Je n'utilise le modèle de la propriété dans ce cas. il suffit d'écrire

 new Model<String>(){ getObject(){...} setObject(){...}}

et mettre en œuvre la bahavior correcte, ce qui fait exactement ce que vous voulez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top