I have the class with 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;
}
}
when I validate values, I got the message:
SEVERE: Servlet.service() for servlet osAppServlet threw exception
java.lang.NoSuchMethodException: userAuth.User.<init>()
where is the problem?
The message java.lang.NoSuchMethodException: userAuth.User.<init>()
means that someone tried to call a constructor without any parameters. Adding a default constructor should solve this problem:
public class User {
public User() {
}
..
}
If the User class is a non-static inner class of another class (e.g. UserAuth), then the message could arise if the User class is attempted to be instantiated before the external class is instantiated. In this case the null-arg constructor might be there in the code but will not be found, since the external class does not exist yet. A solution could be to extract the inner class into an independent class, to make it static or to ensure the initialization of the external class happens before that of the inner class.
Add constructor without parameters:
public class User {
...
public User() {}
...
}
I think the answer of adding a default no-args constructor is clear. However, one must also think about the visibility of the latter constructor. The previous answers show the use of a public no-args default constructor. Is the public visibility relevant with respect to the class' logic?
As a matter of fact, Hibernate doesn't require a public no-args constructor. One can still choose its visibility.
I would therefore recommend to take great care of the constructor's visibility (private/public/protected/default). Choose the adequate one. For example, if no one should be able to call this no args constructor, choose a private visibility like so:
public class User {
...
private User() {}
...
}