是否可以从 dto 和 User 类创建一个新用户?



我正在尝试创建一个注册表单,该表单使用我的 DTO 和 User 类中的字段。 我不确定要去做,可以使用一些帮助。

我有一个看起来像这样的用户类:

@Entity
public class User extends AbstractEntity {
@NotNull
private String username;
@NotNull
private String pwHash;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
@Column(name = "phone_number")
private String phoneNumber;

public User() {}
public User(String username, String password) {
this.username = username;
this.pwHash = encoder.encode(password);
}
public String getUsername() {
return username;
}
private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
public boolean isMatchingPassword(String password) {
return encoder.matches(password, pwHash);
}
// ---> Removed Getters and setters removed for brevity. 

注册表最初设置为要求输入用户名/密码对,然后要求用户通过再次键入密码来确认密码。因此,关联的 DTO 扩展了 LoginFormDTO,并添加了一个用于密码验证的附加字段。当我只要求输入用户名和密码时,我能够完成注册并更新数据库中的这些列。但是现在我想在注册期间添加其他用户信息。

我的数据传输对象已更新为如下所示...(我已经尝试过有和没有@Column注释。

public class RegisterFormDTO extends LoginFormDTO{
private String verifyPassword;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
@Column(name = "phone_number")
private String phoneNumber;

public String getVerifyPassword() {
return verifyPassword;
}
public void setVerifyPassword(String verifyPassword) {
this.verifyPassword = verifyPassword;
}
public String getFirstName() {
return firstName;
}
// additional pojo getters and setters

我的登录表单DTO看起来像这样...

public class LoginFormDTO {
@NotNull
@NotBlank
@Size(min = 3, max = 20, message = "Invalid username. Must be between 3 and 30 characters.")
private String username;
@NotNull
@NotBlank
@Size(min = 5, max = 20, message = "Invalid password. Must be between 5 and 30 characters.")
private String password;

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

}

我的身份验证控制器的注册方法如下所示

@PostMapping("/register")
public String processRegistrationForm(@ModelAttribute @Valid RegisterFormDTO registerFormDTO,
Errors errors, HttpServletRequest request,
Model model) {
if (errors.hasErrors()) {
model.addAttribute("title", "Register");
return "register";
}
User existingUser = userRepository.findByUsername(registerFormDTO.getUsername());
if (existingUser != null) {
errors.rejectValue("username", "username.alreadyexists", "A user with that username already exists");
model.addAttribute("title", "Register");
return "register";
}
String password = registerFormDTO.getPassword();
String verifyPassword = registerFormDTO.getVerifyPassword();
if (!password.equals(verifyPassword)) {
errors.rejectValue("password", "passwords.mismatch", "Passwords do not match");
model.addAttribute("title", "Register");
return "register";
}
User newUser = new User(registerFormDTO.getUsername(), registerFormDTO.getPassword(), registerFormDTO.getFirstName(), registerFormDTO.getLastName(), registerFormDTO.getPhoneNumber(), registerFormDTO.getEmail());
userRepository.save(newUser);
setUserInSession(request.getSession(), newUser);
return "redirect:";
}

我不确定如何从 dto 和用户类创建新用户。 我可以设置用户名和密码,但似乎无法添加用户信息,例如firstNamelastNamephoneNumberemail。 数据库添加idpw_hashusername。 添加这些字段以使它们显示在数据库中的最佳方法是什么? 提前谢谢你。 我从这个乐于助人的社区学到了很多东西!

如何用字段扩展RegisterFormDTO类:firstNamelastNamephoneNumberemail

然后,您的User类应该具有另一个支持usernamepassword以上的构造函数。在这种情况下,若要限制构造函数中的参数数,可以使用生成器设计模式。

您可以在此处阅读更多内容:在 Java 中使用许多参数管理构造函数


关于命名约定的另一件事是,如果您的名字包含超过两个字符的大写快捷方式,您应该继续使用 PascalCase:RegisterDTO->RegisterDto

请参阅: 带首字母缩略词的 Java 命名约定

最新更新