springmvc验证表单属性名问题

6za6bjd0  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(262)

刚得到一个奇怪的行为,用springmvc和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表单视图失败。
通过重命名属性很容易解决这个问题,但是对于这种属性命名有什么约定吗?它是可变的吗?

wdebmtf2

wdebmtf21#

你可以使用 @ModelAttribute .
@modelattribute用于将方法参数或方法返回类型Map/绑定到命名的模型属性。请参阅@modeldattributes 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,将生成“string”。
对于集合/数组,“list”附加在其中元素的类型之后,例如“stringlist”。集合/数组不应为空,因为逻辑使用第一个元素查找其类型。
有关详细信息,请查看此链接。https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/spring-model-attribute-generated-names.html

相关问题