java - 为什么 Controller 需要在绑定(bind)错误上添加模型

标签 java spring spring-boot thymeleaf

在用户注册期间的 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/

相关文章:

java - Jhipster apache tomcat 安装

java - Spring Boot 2 自定义执行器端点

java - @preauthorize spring boot 显示访问权限错误

java - 为冒泡排序执行计时

java - cloud foundry 将路由从一个应用程序复制到另一个应用程序

java - JScrollPane JPanel 和布局

java - Bean 生命周期管理 Spring Boot

java - Spring Boot CrudRepository 或 JpaRepository - 如何将限制作为参数传递?

java - 如何测试 MapStruct 映射器实现并模拟其依赖项

java - 使用长时间运行任务的结果重复更新 JLabel