J'ai le cours avec validation:
public class User {
@Size(min=3, max=20, message="User name must be between 3 and 20 characters long")
@Pattern(regexp="^[a-zA-Z0-9]+$", message="User name must be alphanumeric with no spaces")
private String name;
@Size(min=6, max=20, message="Password must be between 6 and 20 characters long")
@Pattern(regexp="^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$", message="Password must contains at least one number")
private String password;
public User(String _name, String _password){
super();
name = _name;
password = _password;
}
public String getName(){
return name;
}
public String getPassword(){
return password;
}
public void setPassword(String newPassword){
password = newPassword;
}
}
quand je valide des valeurs, j'ai le message:
SEVERE: Servlet.service() for servlet osAppServlet threw exception
Java.lang.NoSuchMethodException: userAuth.User.<init>()
où est le problème?
Le message Java.lang.NoSuchMethodException: userAuth.User.<init>()
signifie que quelqu'un a essayé d'appeler un constructeur sans aucun paramètre. L'ajout d'un constructeur par défaut devrait résoudre ce problème:
public class User {
public User() {
}
..
}
Si la classe User est une classe interne non statique d'une autre classe (par exemple UserAuth), le message peut alors apparaître si la classe User tente d'être instanciée avant que la classe externe ne soit instanciée. Dans ce cas, le constructeur null-arg peut être présent dans le code mais ne sera pas trouvé, car la classe externe n'existe pas encore. Une solution pourrait être d'extraire la classe interne dans une classe indépendante, de la rendre statique ou de s'assurer que l'initialisation de la classe externe se produit avant celle de la classe interne.
Ajouter un constructeur sans paramètres:
public class User {
...
public User() {}
...
}
Je pense que la réponse de l'ajout d'un constructeur par défaut sans argument est claire. Mais il faut aussi penser à la visibilité de ce dernier constructeur. Les réponses précédentes montrent l'utilisation d'un constructeur par défaut public no-args. La visibilité publique est-elle pertinente par rapport à la logique de la classe?
En fait, Hibernate ne nécessite pas de constructeur public no-args. On peut encore choisir sa visibilité.
Je recommanderais donc de faire très attention à la visibilité du constructeur (privé/public/protégé/par défaut). Choisissez celui qui convient. Par exemple, si personne ne peut appeler ce constructeur no args, choisissez une visibilité privée comme ceci:
public class User {
...
private User() {}
...
}