【发布时间】:2020-09-08 17:04:28
【问题描述】:
我正在尝试创建一个注册表单,它使用我的 DTO 和我的用户类中的字段。我不完全确定要去做,可以使用一些帮助。
我有一个如下所示的用户类:
@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
我的 LoginFormDTO 看起来像这样...
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;
}
}
我的AuthenticationController的注册方法是这样的
@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 和用户类创建新用户。我可以设置用户名和密码,但似乎无法添加firstName、lastName、phoneNumber 或email 等用户信息。数据库添加了id、pw_hash 和username。添加这些字段以便它们显示在数据库中的最佳方法是什么?先感谢您。我从这个有用的社区学到了很多东西!
【问题讨论】:
-
您的 DTO 应该在 User 类中包含您以后需要的所有字段。
-
向我们展示您的班级LoginFormDTO。它没有字段 firstName、lastName 等吗?
-
@mentallurg 我想知道这是否可以解决问题。我会试一试。我没有在 LoginFormDTO 中包含这些字段,但将它们包含在 RegistrationDTO 中是有意义的。我应该只使用这种格式:private String firstName,我需要getter和setter吗?这看起来真的是多余的,因为它们已经在 User 类中了。
-
类 RegisterFormDTO 扩展类 LoginFormDTO。这意味着您的对象 registerFormDTO 还具有从类 LoginFormDTO 继承的所有字段。
-
@mentallurg 我在上面添加了 LoginFormDTO。我尝试添加
firstName、lastName等。登录成功,但不会使用附加信息更新数据库。我仍然有点不确定是否应该扩展我的 LoginFormDTo 或只是添加字段?
标签: java spring-boot gradle thymeleaf