java - 复杂对象的@ModelAttribute

标签 java spring spring-mvc spring-boot thymeleaf

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

@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)的表单。现在在我的 Controller 中代替这些参数...

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

...我想使用@ModelAttribute @Valid User 用户。我的问题是:

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

如何利用 @ModelAttribute

最佳答案

与其尝试将所有内容硬塞进您的 User 类,不如编写一个 UserDtoUserForm ,您可以将其转换为 >用户UserForm 将专门用于 web 并稍后转换为 User

您正在谈论的转换应该在您的 Controller 中完成(因为在理想情况下,它只是在实际与您的业务服务对话之前的一个转换层)。

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
}

然后在你的 Controller 中做你想做的事(像这样):

@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 的用例,同时保持你的实际 User 对象干净。

关于java - 复杂对象的@ModelAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50891409/

相关文章:

Spring-Data-Cassandra SchemaAction 不工作

java - Spring数据MongoDB : Query by class instance

java - Spring Boot Maven Plugin——排除所有依赖

java - 如何在 twitter 的 Maven 中运行代码

Java for Eclipse 编译 JRE 问题

java - hibernate.transaction.manager_lookup_class VS hibernate.transaction.jta.platform

url -/和/**之间的区别

java - 如何在不破坏当前设置的情况下安装多个版本的JDK?

java - 如何获取默认的 WebApplicationContext?

ajax - 在 spring mvc 中,请求映射中的 headers = "x-requested-with:XMLHttpRequest"不起作用?