我有以下用于添加用户的Java控制器:
@GetMapping("/registration")
public String registration(Model model) {
if (securityService.isAuthenticated()) {
return "redirect:/";
}
model.addAttribute("userForm", new User());
return "registration";
}
我也有以下验证器来防止重复的用户名:
if (userService.findByEmail(user.getEmail()) != null) {
errors.rejectValue("username", "Duplicate.userForm.username");
}
我现在试图添加一个控制器来更新一个现有的用户。我创建了下面的代码来使用与创建用户时相同的注册表单:
@GetMapping("/users/showFormForUpdate")
public String showFormForUpdate(@RequestParam("userId") long theId, Model theModel) {
User theUser = userService.findById(theId);
theModel.addAttribute("userForm", theUser);
return "registration";
}
我的问题是,当我尝试更新我的重复用户警报出现,如果我不更改用户名。
这是我在注册表单中给出警告的代码:<div class="form-group">
<input type="text" th:field="*{username}" class="form-control" placeholder="Username"
autofocus="true">
<span style="color:red" class="has-error" th:if="${#fields.hasErrors('username')}" th:errors="*{username}"></span>
</div>
总之,当我创建一个用户时,我希望任何重复的用户名被标记,但如果我更新用户,我不希望这样。如何在更新用户的同时保持防止重复用户的能力?我用org.springframework.ui.Model
中的addAttribute
。我知道一种选择是使用不同的表单进行更新,但我希望应该有一种方法可以同时使用一个表单。
if (userService.findByEmail(user.getEmail()) != null) { errors.rejectValue("username", "Duplicate.userForm.username"); }
避免上面的代码级验证,如果用户名是重复的,让数据库报错。即在注册期间,因为User
对象没有userId
, JPA有insert
,如果存在重复,您将得到DataIntegrityViolationException
的通知。在更新期间,由于存在userId
, JPA会执行update
,而不会导致DataIntegrityViolationException
。