2011-01-15 2 views
6

Spring 3 référence nous enseigne:Quelle est la signification de l'annotation @ModelAttribute au niveau de l'argument de la méthode?

Lorsque vous placez sur une méthode paramètre , @ModelAttribute associe un attribut modèle au paramètre de méthode spécifique, annoté

Je ne comprends pas sort magique, parce que je suis sûr que l'alias de cet objet modèle (valeur clé si vous utilisez ModelMap comme type de retour) est passé à la vue après l'exécution de la méthode du gestionnaire de requêtes. Par conséquent, lorsque la méthode du gestionnaire de requêtes s'exécute, le nom de l'objet modèle ne peut pas être mappé au paramètre de la méthode. Pour résoudre cette contradiction je suis allé à stackoverflow et j'ai trouvé this exemple détaillé. L'auteur de l'exemple dit:

// Le modèle « personAttribute » a été transmis au contrôleur du JSP

Il semble, il est charmée par référence printemps ...

Pour dissiper les charmes, j'ai déployé son exemple d'application dans mon environnement et j'ai cruellement coupé l'annotation @ModelAttribute de la méthode MainController.saveEdit(). En conséquence, l'application fonctionne sans aucun changement! Donc je conclus: l'annotation @ModelAttribute n'est pas nécessaire pour passer les valeurs de champ du formulaire web aux champs de l'argument. Puis je suis resté à la question: quelle est la moyenne de @ModelAttribute annotation? Si le seul moyen est de définir l'alias pour l'objet du modèle dans la vue, alors pourquoi mieux que l'ajout explicite de l'objet à ModelMap?

Répondre

8

Le point est que @ModelAttribute est facultative - si l'argument n'est pas annotées et son type n'a pas de signification particulière (à savoir ce n'est pas HttpServletRequest, ModelMap et ainsi de suite), il est traité comme @ModelAttribute l'argument -annotated.

Ainsi, @ModelAttribute est effectivement nécessaire dans deux cas:

  • Pour spécifier le nom de l'attribut. Si @ModelAttribute est omis ou a le value vide, le nom par défaut est utilisé (tapez le nom de l'argument avec la première lettre décapitalisée).

  • Si le type de l'argument a une signification particulière. Par exemple, si l'objet de domaine passé en tant qu'attribut s'étend java.security.Principal, vous devez l'annoter, sinon Spring transmettra un résultat de HttpServletRequest.getUserPrincipal() à la place.

Certaines personnes ont tendance à utiliser @ModelAttribute sans besoin réel afin de documenter le sens des arguments.

Questions connexes