2013-08-02 7 views
24

devo la classe con la convalida: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; 
    } 

} 

quando convalidare valori, ho ricevuto il messaggio:

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

dov'è il problema?

risposta

71

Il messaggio java.lang.NoSuchMethodException: userAuth.User.<init>() significa che qualcuno ha cercato di chiamare un costruttore senza parametri. Aggiungere un costruttore predefinito dovrebbe risolvere questo problema:

public class User { 

    public User() { 

    } 

    .. 
} 
10

Add costruttore senza parametri:

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

Penso che la risposta di aggiungere un costruttore di no-args predefinito sia chiara. Tuttavia, si deve anche pensare alla visibilità di quest'ultimo costruttore. Le risposte precedenti mostrano l'uso di un costruttore predefinito di public no-args. La visibilità del pubblico è rilevante per quanto riguarda la logica della classe?

In effetti, Hibernate non richiede un costruttore di no-args pubblico. Si può ancora scegliere la sua visibilità.

Raccomanderei quindi di fare molta attenzione alla visibilità del costruttore (privato/pubblico/protetto/predefinito). Scegli quello adeguato. Ad esempio, se nessuno dovrebbe essere in grado di chiamare questo nessun costruttore args, scegliere un privato visibilità in questo modo:

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

Se la classe User è una classe interna non statica di un'altra classe (ad es userauth) , quindi il messaggio potrebbe sorgere se si tenta di creare un'istanza della classe User prima che la classe esterna venga istanziata. In questo caso il costruttore null-arg potrebbe essere presente nel codice ma non verrà trovato, poiché la classe esterna non esiste ancora. Una soluzione potrebbe essere quella di estrarre la classe interna in una classe indipendente, renderla statica o garantire che l'inizializzazione della classe esterna avvenga prima di quella della classe interna.

Problemi correlati