【问题标题】:java.lang.NoSuchMethodException: userAuth.User.<init>()java.lang.NoSuchMethodException: userAuth.User.<init>()
【发布时间】:2013-08-04 03:15:45
【问题描述】:

我有带验证的课程:

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

问题出在哪里?

【问题讨论】:

    标签: java spring validation hibernate-validator


    【解决方案1】:

    添加无参数构造函数:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        事实上,Hibernate 不需要 public 无参数构造函数。人们仍然可以选择它的可见性。

        因此,我建议非常注意构造函数的可见性(私有/公共/受保护/默认)。选择合适的。例如,如果没有人应该能够调用此无参数构造函数,请选择 private 可见性,如下所示:

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

        【讨论】:

        • 在我的情况下,其他访问模式仍然会导致错误。所以只能使用公共模式。令人惊讶的是,Intellij IDEA 建议我删除 no args 构造函数。
        • 一个类似的问题,正如 stackoverflow.com/a/27580043/3322533 所指出的,一个 private 静态类将有一个非公共的默认构造函数。
        【解决方案4】:

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

        【讨论】:

        • 太棒了!这是我的确切问题!
        • 我必须公开我的构造函数。
        • 遇到了同样的问题,一旦我将非静态内部类取出并使其成为一个单独的类,它对我来说很好
        猜你喜欢
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 2017-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-10
        相关资源
        最近更新 更多