【问题标题】:how to properly implement attributeHasFieldErrors ( without 'AssertionError: No BindingResult for attribute: abc' error )如何正确实现attributeHasFieldErrors(没有'AssertionError:属性没有BindingResult:abc'错误)
【发布时间】:2018-06-10 17:00:12
【问题描述】:

我正在尝试在我的单元测试中使用.andExpect(model().attributeHasFieldErrors

根据this pagejava.lang.AssertionError: No BindingResult for attribute: abc 是因为被测控制器返回的视图是重定向:“redirect:/xyz/add”。

但与此同时,大多数@PostMapping(/...) 使用重定向。这是否意味着在这种情况下无法知道attributeHasFieldErrors

这似乎是可能的 - 在这个 sample 它似乎正在工作 - 但我对此感到困惑:

testProcessUpdateOwnerFormHasErrors 测试方法(上面链接底部的第二个方法)执行 POST [ i.e. mockMvc.perform(post(... ],并期望控制器类中的 GET 方法返回的视图名称。

也就是说,@GetMapping("/owners/{ownerId}/edit") 在 Controller 中返回 "owners/createOrUpdateOwnerForm"@PostMapping("/owners/{ownerId}/edit") 返回 "redirect:/owners/{ownerId}"。以上执行 POST 的测试需要 "owners/createOrUpdateOwnerForm"。它不应该期待"redirect:/owners/{ownerId}" 吗?

我很困惑。

有人可以解释实现attributeHasFieldErrors 的正确方法吗?

【问题讨论】:

    标签: junit spring-test spring-boot-test


    【解决方案1】:

    通常,您在没有错误时使用重定向,以避免多次 POST。什么时候 出现错误,正常的处理方法是重新显示带有错误消息的相同视图。

    类似:

        @PostMapping("/")
        public String processForm(@Valid UserForm userForm, BindingResult bindingResult, Model model) {
            if ( ! bindingResult.hasErrors()) {         
                Long id = service.saveUser(userForm.getUser()); 
                return "redirect:/user/"+id;
            } else {
              return "calcForm";
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2021-09-01
      • 2021-07-29
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2020-12-11
      • 1970-01-01
      • 2022-11-04
      相关资源
      最近更新 更多