Java 是否可以从dto和User类创建新用户?
我正在尝试创建一个使用DTO和用户类中的字段的注册表单。我不太确定是否去做这件事,可能需要一些帮助 我有一个如下所示的用户类:Java 是否可以从dto和User类创建新用户?,java,spring-boot,gradle,thymeleaf,Java,Spring Boot,Gradle,Thymeleaf,我正在尝试创建一个使用DTO和用户类中的字段的注册表单。我不太确定是否去做这件事,可能需要一些帮助 我有一个如下所示的用户类: @Entity public class User extends AbstractEntity { @NotNull private String username; @NotNull private String pwHash; @Column(name = "first_name") private Strin
@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,并添加了一个用于密码验证的附加字段。当我只要求输入用户名和密码时,我就能够完成注册并更新数据库中的那些列。不过,现在我想在注册期间添加其他用户信息
我的数据传输对象已更新为如下所示。。。(我尝试过使用和不使用@列
注释
公共类RegisterFormDTO扩展LoginFormDTO{
私有字符串验证密码;
@列(name=“first_name”)
私有字符串名;
@列(name=“last_name”)
私有字符串lastName;
@列(name=“email”)
私人字符串电子邮件;
@列(name=“电话号码”)
私有字符串电话号码;
公共字符串getVerifyPassword(){
返回验证密码;
}
public void setVerifyPassword(字符串verifyPassword){
this.verifyPassword=verifyPassword;
}
公共字符串getFirstName(){
返回名字;
}
//额外的pojo getter和setter
我的LoginFormDTO看起来像这样
公共类LoginFormDTO{
@NotNull
@不空白
@大小(最小值=3,最大值=20,message=“无效用户名。必须介于3到30个字符之间。”)
私有字符串用户名;
@NotNull
@不空白
@大小(最小值=5,最大值=20,message=“密码无效。必须介于5到30个字符之间。”)
私有字符串密码;
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
}
我的AuthenticationController的注册方法如下所示
@PostMapping(“/register”)
公共字符串processRegistrationForm(@ModelAttribute@Valid RegisterFormDTO RegisterFormDTO,
错误,HttpServletRequest请求,
(模型){
if(errors.hasErrors()){
模型。添加属性(“标题”、“登记簿”);
返回“登记簿”;
}
User existingUser=userRepository.findByUsername(registerFormDTO.getUsername());
if(existingUser!=null){
errors.rejectValue(“username”、“username.alreadyexists”、“具有该用户名的用户已存在”);
模型。添加属性(“标题”、“登记簿”);
返回“登记簿”;
}
字符串密码=registerFormDTO.getPassword();
字符串verifyPassword=registerFormDTO.getVerifyPassword();
如果(!password.equals(verifyPassword)){
错误。拒绝值(“密码”、“密码.不匹配”、“密码不匹配”);
模型。添加属性(“标题”、“登记簿”);
返回“登记簿”;
}
User newUser=新用户(registerFormDTO.getUsername()、registerFormDTO.getPassword()、registerFormDTO.getFirstName()、registerFormDTO.getLastName()、registerFormDTO.getPhoneNumber()、registerFormDTO.getEmail());
userRepository.save(newUser);
setUserInSession(request.getSession(),newUser);
返回“重定向:”;
}
我不知道如何从dto和user类创建新用户。我可以设置用户名和密码,但似乎无法添加诸如
名字
、姓氏
、电话号码
或电子邮件等用户信息。数据库添加了id
、pw_哈希
和用户名
。这是什么添加这些字段以便它们显示在数据库中的最佳方法是什么?提前谢谢。我从这个有用的社区学到了很多东西!如何将RegisterPerformedTo扩展到带有字段的类:firstName
,lastName
,phoneNumber
,email
然后,您的User
类应该有另一个构造函数,它支持的不仅仅是username
和password
。在这种情况下,为了限制构造函数中的参数数量,您可以使用生成器设计模式
您可以在此处阅读更多内容:
还有一件关于命名约定的事情,如果您的名字包含超过两个字符的大写快捷方式,您应该继续使用PascalCase:RegisterTo
->RegisterTo
请参阅:您的DTO应该在用户类中包含您以后需要的所有字段。向我们展示您的类LoginFormDTO。它是否包含字段firstName、lastName等?@mentalurg我想知道这是否会起作用。我会试一试。我没有在LoginFormDTO中包含这些字段,但将它们包含在RegistrationDTO中是有意义的。我是否应该使用以下格式:private String firstName,我是否需要getter和setter?这看起来确实是多余的,因为它们已经在用户类中。类RegisterFormDTO扩展了类LoginFormDTO。这意味着对象RegisterFormDTO还具有从类LoginFormDTO继承的所有字段。@mentalurg我添加了上面的oginFormDTO。我尝试添加了firstName
,lastName
等。登录成功了,但不会用附加信息更新数据库。我仍然有点不确定我是应该扩展我的LoginFormDTo还是只添加字段?正式地说,你是对的。在一个由10名开发人员组成的团队中,从事一个项目1-2年这些事情是显而易见的