【问题标题】:Spring MVC validation form attribute name problemSpring MVC 验证表单属性名问题
【发布时间】:2021-05-18 18:54:35
【问题描述】:

使用 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 表单视图失败是因为那个。

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

【问题讨论】:

    标签: java spring validation spring-mvc


    【解决方案1】:

    您可以使用@ModelAttribute 执行此操作。

    @ModelAttribute 用于将方法参数或方法返回类型映射/绑定到命名模型属性。请参阅@ModelAttributesJavaDoc。这是一个 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";
    }
    

    为什么会这样?

    Model object自动生成属性名,然后将上述方法调用转发给addAttribute(Object attributeValue)

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

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

    您可以查看此链接了解更多详情。 https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/spring-model-attribute-generated-names.html

    【讨论】:

    • 问题是 update() 方法中模型属性的名称总是'userRepr'。无论editPage中的属性名称是什么。
    • 我可能误解了,我根据您的要求添加了更改方式。 @AlexeyUsharovski
    • 谢谢。并且没有ModelAttribute注解,Spring根据类名制作属性名?你在文档中遇到过相关的事情吗?
    • 我添加了Model 对象的工作原理,以便您了解为什么会这样。 @AlexeyUsharovski
    猜你喜欢
    • 2011-06-21
    • 2015-01-06
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多