java.lang.NoSuchMethodException:userAuth.User。<init>()</init>

时间:2013-08-02 18:35:22

标签: java spring validation hibernate-validator

我的课程有验证:

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

}

当我验证值时,我收到了消息:

SEVERE: Servlet.service() for servlet osAppServlet threw exception
java.lang.NoSuchMethodException: userAuth.User.<init>()

问题出在哪里?

4 个答案:

答案 0 :(得分:98)

消息java.lang.NoSuchMethodException: userAuth.User.<init>()表示有人试图在没有任何参数的情况下调用构造函数。添加默认构造函数应该可以解决这个问题:

public class User {

    public User() {

    }

    ..
}

答案 1 :(得分:19)

如果User类是另一个类的非静态内部类(例如UserAuth),那么如果在实例化外部类之前尝试实例化User类,则可能会出现该消息。在这种情况下,null-arg构造函数可能在代码中但不会被找到,因为外部类尚不存在。解决方案可以是将内部类提取到一个独立的类中,使其成为静态的,或者确保外部类的初始化发生在内部类之前。

答案 2 :(得分:13)

添加不带参数的构造函数:

public class User {
  ...
  public User() {}
  ...
}

答案 3 :(得分:3)

我认为添加默认的no-args构造函数的答案很明确。但是,还必须考虑后一种构造函数的可见性。之前的答案显示了 public no-args默认构造函数的使用。 公开可见性与类的逻辑相关吗?

事实上,Hibernate不需要 public no-args构造函数。人们仍然可以选择其可见度。

因此,我建议您仔细考虑构造函数的可见性(private / public / protected / default)。选择合适的一个。例如,如果没有人能够调用此no args构造函数,请选择私有可见性,如下所示:

public class User {
  ...
  private User() {}
  ...
}