2013-08-02 2 views
24

У меня есть класс с проверкой: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>() 

, где это проблема?

ответ

71

сообщение java.lang.NoSuchMethodException: userAuth.User.<init>() означает, что кто-то пытался вызвать конструктор без параметров. Добавление конструктора по умолчанию должно решить эту проблему:

public class User { 

    public User() { 

    } 

    .. 
} 
10

Добавить конструктор без параметров:

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

Я думаю, что ответ добавления конструктора no-args по умолчанию ясен. Однако нужно также подумать о видимости последнего конструктора. Предыдущие ответы показывают использование публичного конструктора no-args default. Является ли общедоступным видимость, относящаяся к логике класса?

На самом деле, Hibernate не требует public no-args constructor. Можно все же выбрать его видимость.

Поэтому я рекомендую внимательно следить за видимостью конструктора (private/public/protected/default). Выберите подходящий. Например, если никто не должен быть в состоянии назвать это не ARGS конструктора, выбрать частную видимости, как так:

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

Если класс пользователя не является статическим внутренним классом другого класса (например, USERAUTH) , тогда сообщение может возникнуть, если пользовательский класс попытается создать экземпляр перед созданием внешнего класса. В этом случае конструктор null-arg может быть там в коде, но не будет найден, так как внешний класс еще не существует. Решение может состоять в том, чтобы извлечь внутренний класс в независимый класс, сделать его статическим или обеспечить инициализацию внешнего класса до того, что происходит во внутреннем классе.

Смежные вопросы