在用户注册期间的 Spring-Boot Controller 中,如果存在绑定(bind)错误,我的 Controller 会将用户返回到注册页面,但在我的实现中,模型似乎丢失了。
例如我经常在 tutorials 上看到
@PostMapping
public String registerUserAccount(@ModelAttribute("user") @Valid UserRegistrationDto userDto,
BindingResult result){
User existing = userService.findByEmail(userDto.getEmail());
if (existing != null){
result.rejectValue("email", null, "There is already an account registered with that email");
}
if (result.hasErrors()){
return "registration";
}
userService.save(userDto);
return "redirect:/registration?success";
}
如果存在绑定(bind)错误,则返回“registration”
我的 Controller 非常相似:
@PostMapping("/user/register")
public String registerNewUser(@ModelAttribute("user") @Valid RegisterUserDTO registerUserDTO,
BindingResult bindingResult,
Model model,
HttpServletRequest request,
Errors errors) {
User existing = userService.findUserByEmail(registerUserDTO.getEmail());
if (existing != null) {
bindingResult.rejectValue("email", null, "There is already an account with that Email");
}
if (bindingResult.hasErrors()) {
return "register";
}
userService.createUser(registerUserDTO);
return "redirect:/registration?success";
}
}
但是,当我返回“register”时,堆栈上对应于与该对象相关的第一个 thymeleaf 标签的位置出现绑定(bind)错误。
如果我更改 POST Controller 以显式添加模型:
if (bindingResult.hasErrors()) {
model.addAttribute(registerUserDTO);
return "register";
}
然后它就开始工作,返回包含模型和之前输入的数据的页面。
Why am I having to explicitly add the model to the return?
更新
这也不起作用:
@PostMapping("/user/register")
public String registerNewUser(@ModelAttribute("user") @Valid RegisterUserDTO registerUserDTO,
BindingResult bindingResult) {
User existing = userService.findUserByEmail(registerUserDTO.getEmail());
if (existing != null) {
bindingResult.rejectValue("email", null, "There is already an account with that Email");
}
if (bindingResult.hasErrors()) {
return "register";
最佳答案
这有效:
@PostMapping("/user/register")
public String registerNewUser(@ModelAttribute("registerUserDTO") @Valid RegisterUserDTO registerUserDTO,
BindingResult bindingResult) {
User existing = userService.findUserByEmail(registerUserDTO.getEmail());
if (existing != null) {
bindingResult.rejectValue("email", null, "There is already an account with that Email");
}
if (bindingResult.hasErrors()) {
return "register";
}
userService.createUser(registerUserDTO);
return "redirect:/registration?success";
}
正如 M.Denium 指出的那样,@ModelAttribute 名称需要与 GET Controller 中使用的支持对象的实例名称相同。在我的 GET Controller 中,我有:
@GetMapping("/user/register")
String registerForm(Model model) {
RegisterUserDTO registerUserDTO = new RegisterUserDTO();
model.addAttribute(registerUserDTO);
return "register";
}
因此@ModelAttribute需要匹配,即@ModelAttribute("registerUserDTO")
关于java - 为什么 Controller 需要在绑定(bind)错误上添加模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53646455/