web-dev-qa-db-ja.com

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

私は検証付きのクラスを持っています:

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

問題はどこにありますか?

35
Lesya Makhova

メッセージJava.lang.NoSuchMethodException: userAuth.User.<init>()は、誰かがパラメーターなしでコンストラクターを呼び出そうとしたことを意味します。デフォルトのコンストラクタを追加すると、この問題が解決するはずです。

public class User {

    public User() {

    }

    ..
}
102
micha

Userクラスが別のクラスの非静的内部クラス(UserAuthなど)である場合、外部クラスがインスタンス化される前にUserクラスがインスタンス化されようとすると、メッセージが発生する可能性があります。この場合、null-argコンストラクターはコード内に存在する可能性がありますが、外部クラスはまだ存在しないため、見つかりません。解決策は、内部クラスを独立したクラスに抽出し、静的にするか、外部クラスの初期化が内部クラスの初期化よりも前に行われるようにすることです。

22
zovits

パラメーターなしでコンストラクターを追加します。

public class User {
  ...
  public User() {}
  ...
}
13
seralex.vi

デフォルトの引数なしコンストラクタを追加することの答えは明確だと思います。ただし、後者のコンストラクターの可視性についても考慮する必要があります。前の回答は、public no-args default constructorの使用を示しています。 public可視性はクラスのロジックに関連していますか?

実際のところ、Hibernateはpublic no-argsコンストラクターを必要としません。可視性を選択することもできます。

したがって、コンストラクターの可視性(private/public/protected/default)に細心の注意を払うことをお勧めします。適切なものを選択してください。たとえば、誰もこれを引数なしコンストラクタと呼ぶことができない場合、次のようなprivate可視性を選択します。

public class User {
  ...
  private User() {}
  ...
}
3
D. Lawrence