Spring MVC: le fait d'Avoir de multiples @ModelAttribute en forme de manipulation de l'action

Le contexte

J'ai une simple association entre les deux entités - Category et Email (NtoM). Je suis en train de créer l'interface web pour la navigation et de leur gestion. Pour parcourir la catégorie et d'ajouter des e-mails dans cette catégorie, j'utilise le contrôleur enveloppé avec @RequestMapping avec l'ID de la catégorie (UUID), de sorte que toutes les actions du contrôleur sont toujours en prenant place dans le contexte de la catégorie spécifiée avec chemin d'accès.

- Je utiliser @ModelAttribute de pré-charger le contexte de catégorie pour l'ensemble du contrôleur de portée.

Le problème

Cette approche a bien fonctionné pour l'inscription et pour l'affichage des formes. Cependant, il échoue sur le formulaire de soumission - après le débogage un peu, j'ai découvert que les données de formulaire remplace ma catégorie @ModelAttribute paramètre.

Dans mon code, dans la méthode save() la category n'est pas vraiment le modèle de l'attribut chargé avec addCategory() méthode, mais est rempli avec les données du formulaire (email modèle est aussi peuplée, et que c'est correct).

Je suis à la recherche de la solution qui me permettra de lier les données de formulaire à seulement certains @ModelAttribute.

J'ai lu dans Spring MVC documentation que l'ordre des arguments de questions, mais je les ai commandés en conséquence à des exemples et encore cela ne fonctionne pas comme prévu.

Le code

Voici mon controller:

@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());
    }
}

Juste au cas où, ici, est également le code du formulaire:

<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>

Remarque: je ne veux pas de multiples @ModelAttributes à venir à partir de POST, je veux juste vous distinguer en quelque sorte de modèle de formulaire à partir d'précédemment généré attribut(s).

OriginalL'auteur Rafał Wrzeszcz | 2013-10-08