Spring MVC:表单处理操作中具有多个@ModelAttribute

拉斐尔·维尔泽斯

上下文

我在两个实体之间有一个简单的关联-CategoryEmail(NtoM)。我正在尝试创建用于浏览和管理它们的Web界面。为了浏览类别并将电子邮件添加到该类别中,我使用包裹有@RequestMapping类别ID(UUID)的控制器,因此所有控制器操作始终在使用path指定的类别的上下文中进行。

@ModelAttribute用来预加载整个控制器范围的上下文类别。

问题

这种方法非常适合列出和显示表单。但是,它在提交表单时失败-经过一点调试后,我发现表单数据覆盖了我的category@ModelAttribute参数。

在我的代码中,方法save()category的确不是用addCategory()方法加载的模型属性,而是用表单数据填充的(email模型也填充了,这是正确的)。

我在寻找解决方案,使我只能将表单数据绑定到specific @ModelAttribute

我在Spring MVC文档中已经读到,参数的顺序很重要,但是我根据示例对它们进行了排序,但仍然无法正常工作。

代码

这是我的控制器:

@Controller
@RequestMapping("/emails/{categoryId}")
public class EmailsController
{
    @ModelAttribute("category")
    public Category addCategory(@PathVariable UUID categoryId)
    {
        return this.categoryService.getCategory(categoryId);
    }

    @InitBinder
    public void initBinder(WebDataBinder binder)
    {
        binder.registerCustomEditor(Set.class, "categories", new CategoriesSetEditor(this.categoryService));
    }

    @RequestMapping(value = "/create", method = RequestMethod.GET)
    public String createForm(@ModelAttribute Category category, Model model)
    {
        // here everything works, as there is just a single @ModelAttribute

        return "emails/form";
    }

    @RequestMapping(value = "/save", method = RequestMethod.POST)
    public String save(
        @ModelAttribute @Valid Email email,
        BindingResult result,
        Model model,
        @ModelAttribute("category") Category category
    ) {
        // saving entity, etc

        // HERE! problem is, that response is bound BOTH to `email' and `category' model attributes
        // and overrides category loaded in `addCategory()' method
        return String.format("redirect:/emails/%s/", category.getId().toString());
    }
}

以防万一,这里也是表单代码:

<form:form action="${pageContext.request.contextPath}/emails/${category.id}/save" method="post" modelAttribute="email">
    <form:hidden path="id"/>
    <fieldset>
        <label for="emailName"><spring:message code="email.form.label.Name" text="E-mail address"/>:</label>
        <form:input path="name" id="emailName" required="required"/>
        <form:errors path="name" cssClass="error"/>

        <label for="emailRealName"><spring:message code="email.form.label.RealName" text="Recipient display name"/>:</label>
        <form:input path="realName" id="emailRealName"/>
        <form:errors path="realName" cssClass="error"/>

        <label for="emailIsActive"><spring:message code="email.form.label.IsActive" text="Activation status"/>:</label>
        <form:checkbox path="active" id="emailIsActive"/>
        <form:errors path="active" cssClass="error"/>

        <form:checkboxes path="categories" element="div" items="${categories}" itemValue="id" itemLabel="name"/>
        <form:errors path="categories" cssClass="error"/>

        <button type="submit"><spring:message code="_common.form.Submit" text="Save"/></button>
    </fieldset>
</form:form>

注意:我不希望@ModelAttributePOST包含多个s,而只是想将表单模型与先前生成的属性区分开。

克雷西米尔·内塞克(KrešimirNesek)

我不确定我是否完全理解问题,但是对我来说,似乎您希望在显示表单时模型中存在类别对象,但不希望通过表单发布对其进行更改?

当您在参数列表中指定@ModelAttribute(“ categories”)时,您基本上会告诉Spring MVC使用参数名称“ categories”将表单数据绑定到带注释的对象。

如果您不希望绑定对象,则将其从参数列表中删除。如果您需要处理程序方法中的原始对象,可以通过调用addCategory并提供与@PathVariable映射的ID来手动获取它:

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(
    @ModelAttribute @Valid Email email,
    BindingResult result,
    Model model,
    @PathVaribale("categoryId") UUID categoryId
) {
    // saving entity, etc

    return String.format("redirect:/emails/%s/", categoryId.toString());
    //if category object is needed and not just id then fetch it with Category c = addCategory(categoryId).
}

(PS。如果您注册了使用categoryService将Long转换为Category的转换器,则还@PathVariable("categoryId") Category category可以将Category对象映射到路径变量而不是UUID,如果您愿意的话,请参见7.5.5配置ConversionService

(编辑:删除了以不同名称命名模型的建议,因为这将无济于事,并添加了示例)

就个人而言,如果我需要这种行为(在显示表单时需要在表单中显示一个对象,但在发布表单时不将其绑定到对象),则我不会使用ModelAttribute注释方法来填充模型。相反,我将在显示表单时手动填充模型。那是更多的代码(实际上,只有一行),但魔术性较小,更易于理解。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring MVC表单处理多个pojos

来自分类Dev

Spring Framework JSP表单处理:@ModelAttribute

来自分类Dev

Spring Framework JSP表单处理:@ModelAttribute

来自分类Dev

Spring MVC @ModelAttribute来自表单的零ID

来自分类Dev

在Spring表单处理中是否必须,表单必须具有与model属性对应的所有字段

来自分类Dev

在Spring表单处理中是否必须,表单必须具有与model属性对应的所有字段

来自分类Dev

在Spring MVC中处理多个页面

来自分类Dev

具有Spring MVC的动态表单绑定表单对象CGLIB

来自分类Dev

如何在Spring-MVC上处理具有多个参数的请求

来自分类Dev

Spring MVC @ModelAttribute方法

来自分类Dev

Spring // JSP //表单处理-在字符串上使用@ModelAttribute

来自分类Dev

如何在Spring MVC中处理没有绑定对象的多行表单

来自分类Dev

在Spring MVC中使用@ModelAttribute获取CommandBean或表单Bean对象

来自分类Dev

在 Spring Web MVC 注释中使用具有多个操作的主 jsp 页面并将部分 jsp 页面调用到主页面中的任何方法。任何例子?

来自分类Dev

如何在spring-mvc中接受具有相同ID的多个REST查询参数?

来自分类Dev

如何在spring-mvc中接受具有相同ID的多个REST查询参数?

来自分类Dev

如何使用Spring MVC RequestMapping具有多个参数?

来自分类Dev

Spring MVC:具有相同名称的多个选择控件

来自分类Dev

具有多个URI的Spring MVC控制器

来自分类Dev

具有Spring Data JPA的Spring MVC

来自分类Dev

Spring MVC ModelAttribute作为接口

来自分类Dev

Spring MVC manytomany @Modelattribute 绑定

来自分类Dev

Spring MVC ModelAttribute 值丢失

来自分类Dev

Spring MVC:是否有必要测试@ModelAttribute是否为null?

来自分类Dev

Spring MVC:是否有必要测试@ModelAttribute是否为null?

来自分类Dev

Spring MVC中的@ModelAttribute必须代表Hibernate中的实体吗?

来自分类Dev

具有多个具有相同属性名称的模型属性的Spring表单路径

来自分类Dev

Spring MVC表单-下拉列表中没有项目?

来自分类Dev

无法在Spring MVC中更新以@ModelAttribute注释的对象

Related 相关文章

  1. 1

    Spring MVC表单处理多个pojos

  2. 2

    Spring Framework JSP表单处理:@ModelAttribute

  3. 3

    Spring Framework JSP表单处理:@ModelAttribute

  4. 4

    Spring MVC @ModelAttribute来自表单的零ID

  5. 5

    在Spring表单处理中是否必须,表单必须具有与model属性对应的所有字段

  6. 6

    在Spring表单处理中是否必须,表单必须具有与model属性对应的所有字段

  7. 7

    在Spring MVC中处理多个页面

  8. 8

    具有Spring MVC的动态表单绑定表单对象CGLIB

  9. 9

    如何在Spring-MVC上处理具有多个参数的请求

  10. 10

    Spring MVC @ModelAttribute方法

  11. 11

    Spring // JSP //表单处理-在字符串上使用@ModelAttribute

  12. 12

    如何在Spring MVC中处理没有绑定对象的多行表单

  13. 13

    在Spring MVC中使用@ModelAttribute获取CommandBean或表单Bean对象

  14. 14

    在 Spring Web MVC 注释中使用具有多个操作的主 jsp 页面并将部分 jsp 页面调用到主页面中的任何方法。任何例子?

  15. 15

    如何在spring-mvc中接受具有相同ID的多个REST查询参数?

  16. 16

    如何在spring-mvc中接受具有相同ID的多个REST查询参数?

  17. 17

    如何使用Spring MVC RequestMapping具有多个参数?

  18. 18

    Spring MVC:具有相同名称的多个选择控件

  19. 19

    具有多个URI的Spring MVC控制器

  20. 20

    具有Spring Data JPA的Spring MVC

  21. 21

    Spring MVC ModelAttribute作为接口

  22. 22

    Spring MVC manytomany @Modelattribute 绑定

  23. 23

    Spring MVC ModelAttribute 值丢失

  24. 24

    Spring MVC:是否有必要测试@ModelAttribute是否为null?

  25. 25

    Spring MVC:是否有必要测试@ModelAttribute是否为null?

  26. 26

    Spring MVC中的@ModelAttribute必须代表Hibernate中的实体吗?

  27. 27

    具有多个具有相同属性名称的模型属性的Spring表单路径

  28. 28

    Spring MVC表单-下拉列表中没有项目?

  29. 29

    无法在Spring MVC中更新以@ModelAttribute注释的对象

热门标签

归档