2013-08-02 10 views
24

私は検証を持つクラスがあります。java.lang.NoSuchMethodException:userAuth.User。 <init>()

SEVERE: Servlet.service() for servlet osAppServlet threw exception 
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; 
    } 

} 

は、私がメッセージを得ましたか。

答えて

71

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

public class User { 

    public User() { 

    } 

    .. 
} 
10

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

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

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

実際には、Hibernateは公開 no-argsコンストラクタを必要としません。それでも視認性を選択することができます。

したがって、コンストラクタの可視性(private/public/protected/default)を十分に考慮する必要があります。適切なものを選んでください。 Userクラスが別のクラス(例えばUSERAUTH)の非static内部クラスである場合

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

:例えば、誰もがそうのようなプライベート可視性を選択し、何の引数のコンストラクタこれを呼び出していないことができないかどうかを外部クラスがインスタンス化される前にUserクラスがインスタンス化されようとすると、メッセージが生成される可能性があります。この場合、外部クラスがまだ存在しないため、null-argコンストラクタがコード内に存在する可能性がありますが、見つからないことがあります。解決策は、内部クラスを独立したクラスに抽出し、それを静的にするか、または内部クラスの前に外部クラスの初期化を確実に行うことです。

関連する問題