Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以从dto和User类创建新用户?_Java_Spring Boot_Gradle_Thymeleaf - Fatal编程技术网

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

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

我正在尝试创建一个使用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,并添加了一个用于密码验证的附加字段。当我只要求输入用户名和密码时,我就能够完成注册并更新数据库中的那些列。不过,现在我想在注册期间添加其他用户信息

我的数据传输对象已更新为如下所示。。。(我尝试过使用和不使用
@列
注释

公共类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年这些事情是显而易见的