Java构造方法未定义问题:实现程序启动自动初始化用户
解决构造方法未定义的错误
嘿,这个问题我太熟悉了!你看到的The constructor UsersVO(int, String, String, String, String, String, String, boolean) is undefined错误,本质是你调用的带8个参数的构造方法,在你的UsersVO类里根本没有被定义。
Java类默认只会提供一个无参构造函数(就是public UsersVO() {}),除非你显式写出其他构造方法。而你在usersInit()里直接用new UsersVO(1,"admin@gmail.com", ...)去创建对象,编译器找不到匹配的构造方法,自然就报错了。
另外还要提一句:你的userId字段加了@GeneratedValue(strategy=GenerationType.AUTO),说明这个主键是数据库自动生成的,手动传1进去其实没必要,反而可能和JPA的自动生成逻辑冲突,所以初始化的时候不需要设置这个字段。
下面给你两种可行的解决方案:
方案一:添加匹配参数的构造方法(同时保留无参构造)
JPA要求实体类必须有无参构造,所以我们要同时定义无参构造和你需要的参数构造:
@Entity @Table(name = "fmsusers") public class UsersVO { // 所有字段定义保持不变... // 保留JPA需要的无参构造 public UsersVO() {} // 添加对应参数的构造方法(注意去掉userId,因为它是自动生成的) public UsersVO(String userEmail, String password, String passwordConfirm, String firstName, String lastName, String phoneNumber, boolean enabled) { this.userEmail = userEmail; this.password = password; this.passwordConfirm = passwordConfirm; this.firstName = firstName; this.lastName = lastName; this.phoneNumber = phoneNumber; this.enabled = enabled; // 这里可以顺便初始化rolesVO集合,避免空指针 this.rolesVO = new HashSet<>(); } // 你的usersInit方法修改为: public static List<UsersVO> usersInit() throws Exception { List<UsersVO> initUsers = new ArrayList<>(); try { initUsers.add(new UsersVO("admin@gmail.com", "$2a$10$PrI5Gk9L.tSZiW9FXhTS8O8Mz9E97k2FZbFvGFFaSsiTUIl.TCrFu", "$2a$10$PrI5Gk9L.tSZiW9FXhTS8O8Mz9E97k2FZbFvGFFaSsiTUIl.TCrFu", "Claude", "Kabayiza","0783240776", true)); } catch (Exception e) { e.printStackTrace(); } return initUsers; } }
方案二:使用Setter方法初始化对象(更符合JPA最佳实践)
这种方式不需要额外定义构造方法,利用无参构造创建对象后,通过Setter方法设置各个属性,更灵活也更安全:
@Entity @Table(name = "fmsusers") public class UsersVO { // 所有字段定义保持不变... // 给每个字段添加Setter方法(JPA实体通常需要Getter和Setter) public void setUserEmail(String userEmail) { this.userEmail = userEmail; } public void setPassword(String password) { this.password = password; } public void setPasswordConfirm(String passwordConfirm) { this.passwordConfirm = passwordConfirm; } public void setFirstName(String firstName) { this.firstName = firstName; } public void setLastName(String lastName) { this.lastName = lastName; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } public void setEnabled(boolean enabled) { this.enabled = enabled; } public void setRolesVO(Set<RolesVO> rolesVO) { this.rolesVO = rolesVO; } // 你的usersInit方法修改为: public static List<UsersVO> usersInit() throws Exception { List<UsersVO> initUsers = new ArrayList<>(); try { UsersVO adminUser = new UsersVO(); adminUser.setUserEmail("admin@gmail.com"); adminUser.setPassword("$2a$10$PrI5Gk9L.tSZiW9FXhTS8O8Mz9E97k2FZbFvGFFaSsiTUIl.TCrFu"); adminUser.setPasswordConfirm("$2a$10$PrI5Gk9L.tSZiW9FXhTS8O8Mz9E97k2FZbFvGFFaSsiTUIl.TCrFu"); adminUser.setFirstName("Claude"); adminUser.setLastName("Kabayiza"); adminUser.setPhoneNumber("0783240776"); adminUser.setEnabled(true); adminUser.setRolesVO(new HashSet<>()); // 初始化集合 initUsers.add(adminUser); } catch (Exception e) { e.printStackTrace(); } return initUsers; } }
最后提醒一下:不管用哪种方案,记得给UsersVO的所有字段添加上Getter方法,JPA和业务逻辑里通常都会用到它们哦~
内容的提问来源于stack exchange,提问作者Claude Kabayiza
相关产品推荐
相关产品推荐

