首页 > 解决方案 > Spring MVC 验证表单属性名问题

问题描述

使用 Spring MVC 和 Thymleaf 验证一个非常简单的 HTML 表单时出现了一个奇怪的行为。

我有这种方法用于编辑页面渲染和提交的表单句柄。

    @GetMapping("/{id}")
    public String editPage(@PathVariable("id") Long id, Model model) {

        model.addAttribute("user", userService.findById(id)
                .orElseThrow(NotFoundException::new));
        return "user_form";
    }


    @PostMapping("/update")
    public String update(@Valid UserRepr user, BindingResult result, Model model) {
        logger.info("Update endpoint requested");

        if (result.hasErrors()) {
            return "user_form";
        }

        userService.save(user);
        return "redirect:/user";
    }

update() 方法中的连线事情是,在验证错误的情况下,具有表单内容的模型属性的名称为“userRepr”,但不是我所期望的“user”,因此 thymleaf 表单视图失败。

通过重命名属性很容易解决问题,但是关于这种属性命名是否有一些约定?它是可变的吗?

标签: javaspringvalidationspring-mvc

解决方案


您可以使用@ModelAttribute.

@ModelAttribute 用于将方法参数或方法返回类型映射/绑定到命名模型属性。请参阅@ModelAttributes JavaDoc。这是一个 Spring 注释。

@PostMapping("/update")
public String update(@Valid @ModelAttribute("user") UserRepr user, BindingResult result, Model model) {
    logger.info("Update endpoint requested");

    if (result.hasErrors()) {
        return "user_form";
    }

    userService.save(user);
    return "redirect:/user";
}

为什么它看起来像这样?

模型对象自动生成属性名称,然后将上述方法调用转发到addAttribute(Object attributeValue).

以下是名称生成策略的规则:

  • 对于不是集合的对象,将生成短类名。例如对于 java.lang.String,将生成“字符串”。
  • 对于集合/数组,“List”附加在元素类型之后,例如“stringList”。集合/数组不应为空,因为逻辑使用第一个元素来查找它的类型。

您可以查看此链接以获取更多详细信息。https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/spring-model-attribute-generated-names.html


推荐阅读