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

56

我有一个带验证的类:

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

问题在哪里?

6个回答

143

这条消息 java.lang.NoSuchMethodException: userAuth.User.<init>() 意味着有人试图调用一个没有参数的构造函数。添加一个默认构造函数应该可以解决这个问题:

public class User {

    public User() {

    }

    ..
}

好的、直截了当的解释。那么构造函数的可见性限制呢? - Guy_g23
真的很有帮助(对我来说) - Farkhod Abdukodirov

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

2
太好了!这正是我的问题! - Muthu Ganapathy Nathan
我必须将我的构造函数设为公共的。 - Jeff
3
我曾遇到相同的问题,当我将非静态内部类移出并将其变为独立类时,它就正常工作了。 - pkramaric

16

添加无参数构造函数:

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

5
我认为添加一个默认的无参构造函数的答案很清晰。然而,我们还必须考虑后者构造函数的可见性。之前的答案展示了使用public的无参默认构造函数。这个public的可见性与类的逻辑有关吗?
事实上,Hibernate并不需要public的无参构造函数。人们仍然可以选择其可见性。
因此,我建议非常注意构造函数的可见性(private/public/protected/default)。选择适当的可见性。例如,如果没有人应该能够调用这个无参构造函数,请选择private的可见性,如下所示:
public class User {
  ...
  private User() {}
  ...
}

1
在我的情况下,其他访问模式仍会导致错误。因此只能使用公共模式。令人惊讶的是,Intellij IDEA 建议我删除无参构造函数。 - deadLock
一个类似的问题,正如 https://dev59.com/c14c5IYBdhLWcg3wvsfB#27580043 所指出的那样,一个 私有 静态类将具有非公共默认构造函数。 - User1291

3

Bean应该要有一个无参构造函数。


1
你的回答可以通过添加更多支持性信息来改进。请编辑以添加进一步细节,例如引用或文档,以便他人可以确认你的回答是否正确。您可以在帮助中心中找到有关编写良好答案的更多信息。 - Community

0
如果你正在使用Lombok,你可以在类上使用注解@AllArgsConstructor和@NoArgsConstructor。
@AllArgsConstructor @NoArgsConstructor public class User { ... }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接