|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre régulier
![]() Lionel ANDREInscription : avril 2005 Messages : 294 ![]() |
Bonjour à tous,
Je viens de me rendre compte d'un gros problème avec Spring MVC. J'ai un controlleur qui possède 2 méthodes annotées "@ModelAttribute" avec des classes différentes : "Project" et "Document". C'est 2 classes possède (entre autre) les propriété "id" et "reference". @ModelAttribute("project") est systématiquement appelé dans tous mes controlleurs "projet". Il récupère la référence du projet à partir de l'url et l'ajoute dans la session s'il est différent de celui déjà existant. Lorsque je POST mon formulaire d'édition d'un document, je me retrouve du coup avec @ModelAttribute("project") et @ModelAttribute("document") qui se suivent. Le problème c'est que ça génè-re des collisions : l'id de mon projet est égale à l'id du document, et la même chose pour la référence. Un bug ? Une erreur ? Une mauvaise pratique ? Comment corriger le problème ? |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : septembre 2006 Messages : 2 291 ![]() |
Version de Spring + le code pls.
A priori, je soupçonnerais un mélange de 2 @Controller multi-action et @ModelAttribute sur des méthodes. S'il n'y a pas de @RequestMapping sur la classe @Controller, Spring ne peut sans doute pas limiter le scope des méthodes annotées @ModelAttribute. |
|
|
00
|
|
|
#3 |
|
Membre régulier
![]() Lionel ANDREInscription : avril 2005 Messages : 294 ![]() |
Bonsoir,
J'utilise spring 3.0.5. Je n'ai pas le code sur moi, je le posterai demain matin à la 1ère heure. En attendant voici l'architecture : J'ai eu classe abstraite AbstractProjectController, et une classe DocumentController qui hérite de AbstractProjectController. Il y a plusieurs modules pour un projet, dont une base documentaire. Chaque controller d'un module de projet hérite de AbstractProjectController. AbstractProjectController possède entre autre cette fameuse méthode qui est annotée "@ModelAttribute("project")" qui permet de récupérer le projet à partir d'une "path variable" de l'url. Je n'ai jamais eu de problème jusqu'à présent, mais je n'avais pas le scénario d'avoir 2 propriétés de même nom pour 2 modèle attribute différent... |
|
|
00
|
|
|
#4 | ||||
|
Membre régulier
![]() Lionel ANDREInscription : avril 2005 Messages : 294 ![]() |
Comme promis voici le code.
AbstractProjectController : Code :
Code :
|
||||
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() Inscription : septembre 2006 Messages : 2 291 ![]() |
vous avez 2 fois @ModelAttribute(MODEL_ATTR_CURRENT_PROJECT)… donc il est appelé 2 fois…
si vous avez une méthode @ModelAttribute(MODEL_ATTR_CURRENT_PROJECT), il ne faut rajouter un paramètre, en principe la méthode suffit… et si vous faites @Controller avec @RequestMapping, j'éviterais de rajouter @RequestMapping sur une méthode de ce controller pour changer l'URL, mais uniquement pour préciser method=RequestMethod |
|
|
00
|
|
|
#6 |
|
Membre régulier
![]() Lionel ANDREInscription : avril 2005 Messages : 294 ![]() |
Bonjour JeitEmgie,
Effectivement je n'ai plus ce phénomène de collision si je commente "@ModelAttribute(MODEL_ATTR_CURRENT_PROJECT) Project currentProject," dans DocumentController.processSubmitEditDocumentForm(), et que j'utilise "Project project = (Project) model.get(MODEL_ATTR_CURRENT_PROJECT);" à la place. Pourtant je pensais que c'était équivalent. J'ai vérifié avec des points d'arrêt, et la méthode annotée "@ModelAttribute(MODEL_ATTR_CURRENT_PROJECT)" est appelée 2 fois dans tous les cas. Sauf que si je mets "@ModelAttribute(MODEL_ATTR_CURRENT_PROJECT) Project currentProject" dans les paramètres alors qu'il y a déjà un "@ModelAttribute" avec une autre classe ayant des nom propriétés identiques, alors Spring prend les valeurs soumises par le modelAttribute du formulaire.... Est-ce normal ? Existe-t-il un moyen d'y remédié ? |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com