代码之家  ›  专栏  ›  技术社区  ›  Mahozad

@复杂对象的modelattribute

  •  5
  • Mahozad  · 技术社区  · 7 年前

    我有一个具有许多属性的用户实体(此处未显示某些字段):

    @Entity
    public class User {
    
        @OneToOne(cascade = ALL, orphanRemoval = true)
        private File avatar; // File is a custom class I have created
    
        @NotEmpty
        @NaturalId
        private String name;
    
        @Size(min = 6)
        private String password;
    
        @Enumerated(EnumType.STRING)
        private Role role;
    }
    

    在我的thymeleaf模板中,我有一个提交 用户名 ,请 密码 阿凡达 ( MultipartFile )。现在在我的控制器中,而不是这些参数…

    @PostMapping("/register")
    public String register(@RequestParam String username,
                           @RequestParam String password,
                           @RequestParam MultipartFile avatar) { ...
    

    …我想用 @ModelAttribute @Valid User user .我的问题是:

    1. 首先应加密密码,然后传递给用户实体,
    2. 来自的字节[] 多部分文件 应该提取,然后存储在用户实体中(作为自定义 File 对象),
    3. 其他一些字段,如 Role 应该在服务类中手动设置。

    我怎样才能利用 @ModelAttribute 是吗?

    3 回复  |  直到 6 年前
        1
  •  6
  •   Mahozad    7 年前

    而不是把所有的东西都塞进你的 User 类,写入 UserDto UserForm 可以从/转换为 用户 .这个 户窗体 将专门用于Web并转换为 用户 后来。

    您所谈论的转换应该在控制器中完成(因为理想情况下,在实际与业务服务交谈之前,这只是一个转换层)。

    public class UserForm {
    
        private MultipartFile avatar; 
    
        @NotEmpty
        private String username;
    
        @Size(min = 6)
        @NotEmpty
        private String password;
    
        public UserForm() {}
    
        public UserForm(String username) {
             this.username = username;
        }
    
        static UserForm of(User user) {
            return new UserForm(user.getUsername());
        }
    
        // getters/setters omitted for brevity
    }
    

    然后在你的控制器中做你想做的事情(像这样的事情):

    @PostMapping("/register")
    public String register(@ModelAttribute("user") UserForm userForm, BindingResult bindingResult) {
        if (!bindingResult.hasErrors()) {
          User user = new User();
          user.setName(userForm.getUsername());
          user.setPassword(encrypt(userForm.getPassword());
          user.setAvataor(createFile(userForm.getAvatar());
          userService.register(user);
          return "success";
        } else {
          return "register";
        }
    } 
    

    这样,您就有了一个专门的对象来修复基于Web的用例,同时保持 用户 物体清洁。

        2
  •  0
  •   Michał    7 年前

    也许你可以用一个setter来做所有这些动作。当Spring将数据映射到字段,并且在实体中有setter时,它将使用它们来传递数据。您可以用这种方式预处理数据,并将最终值设置为字段。

        3
  •  0
  •   Karol Katanowski    7 年前
     @PostMapping("/register")
    public String register(@ModelAttribute User user, Model model) { // remember if You have another name for parameter and backing bean You should type this one @ModelAttribute(name="userFromTemplate") User user
        encryptPassword(user.getPassword); //remember that is sample code, You can do it however You want to 
        extractBytes(user.getAvatar); //same here
        user.setRole(manuallySetRole);
        model.addAttribute("user", user);
            return "success"; // here u can redirect to ur another html which will contain info about ur user
        } else
            return "redirect:sorry";
    }
    encryptPassword(String password) { ... }
    same for the rest methods
    

    在这里,我将向您提供示例代码,说明如何在示例中使用@modelattribute。如果您有任何问题,请随时发表评论。