首页 > 解决方案 > 是否可以从 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、或。数据库添加,和. 添加这些字段以便它们显示在数据库中的最佳方法是什么?先感谢您。我从这个有用的社区学到了很多东西! lastNamephoneNumberemailidpw_hashusername

标签: javaspring-bootgradlethymeleaf

解决方案


如何RegisterFormDTO使用字段扩展类:firstName, lastName, phoneNumber, email

然后,您的User类应该有另一个支持多于username和的构造函数password。在这种情况下,要限制构造函数中的参数数量,您可以使用构建器设计模式。

您可以在此处阅读更多信息:在 Java 中管理具有许多参数的构造函数


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

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


推荐阅读