gpt4 book ai didi

java - 复杂对象的@ModelAttribute

转载 作者:搜寻专家 更新时间:2023-10-31 19:52:01 25 4
gpt4 key购买 nike

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

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com