java - 是否可以从 dto 和 User 类创建一个 newUser ?
问题描述
我正在尝试创建一个注册表单,它使用我的 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
解决方案
如何RegisterFormDTO
使用字段扩展类:firstName
, lastName
, phoneNumber
, email
?
然后,您的User
类应该有另一个支持多于username
和的构造函数password
。在这种情况下,要限制构造函数中的参数数量,您可以使用构建器设计模式。
您可以在此处阅读更多信息:在 Java 中管理具有许多参数的构造函数
关于命名约定的另一件事,如果您的名称包含超过两个字符的大写快捷方式,您应该继续使用 PascalCase: RegisterDTO
-> RegisterDto
。
推荐阅读
- git - 在合并我的拉取请求之前,我可以将更新从发布分支拉到我的功能分支吗?
- php - laravel 6 socialite login facebook / 如何修复无法加载 URL:此 URL 的域不包含在应用程序的域中
- python - 结合和优化python 3列表推导
- mysql - MySQL:基于资源的游戏的表结构
- jenkins - Jenkins 管道确定分支是否用于 Bitbucket 拉取请求
- java - 无法将日期显示为 yyyy-MM-dd'T'HH:mm:ss:SSS Java
- shell - 如果条件为使用通配符分配文件检查变量 - shell 脚本
- excel - 如何从 excel 中的数据透视切片器中删除 N/A?
- .net-core - .Net Core 控制台应用程序发布要复制什么?
- r - 从连接的字符串中提取前 n 个字符