2011-01-15 1 views
6

Frühling 3 Referenz lehrt uns:Was bedeutet @ModelAttribute-Annotation auf Methodenargumentebene?

Wenn Sie es auf einem Parameter-Methode platzieren, @ModelAttribute bildet ein Modell-Attribut auf den spezifischen, kommentierte Methodenparameter

Ich verstehe nicht, diese Zauberspruch, weil ich sicher bin, dass der Alias ​​des Modellobjekts (Schlüsselwert bei Verwendung von ModelMap als Rückgabetyp) nach Ausführung der Anforderungshandlermethode an View übergeben wird. Daher kann der Name des Modellobjekts nicht auf den Methodenparameter abgebildet werden, wenn die Request-Handler-Methode ausgeführt wird.

Um diesen Widerspruch zu lösen, ging ich zu stackoverflow und fand this ausführliches Beispiel. Der Autor Beispiel sagte:

// Das "personAttribute" -Modell hat an den Controller aus der JSP bestanden

Es scheint, wurde er von Frühling Referenz begeistert ist ...

Um die Reize zu vertreiben, habe ich seine Beispiel-App in meiner Umgebung eingesetzt und @ModelAttribute Annotation aus der Methode MainController.saveEdit() grausam geschnitten. Als Ergebnis funktioniert die Anwendung ohne Änderungen! So schließe ich: Die Annotation @ModelAttribute wird nicht benötigt, um die Feldwerte des Webformulars an die Felder des Arguments zu übergeben. Dann blieb ich bei der Frage: Was ist der Durchschnitt von @ModelAttribute Annotation? Wenn das einzige Mittel darin besteht, Alias ​​für das Modellobjekt in View zu setzen, warum dann besser als das explizite Hinzufügen eines Objekts zu ModelMap?

Antwort

8

Der Punkt ist, dass @ModelAttribute optional ist - wenn Argument nicht mit Anmerkungen versehen und als Typ hat keine spezielle Bedeutung (das heißt, es ist nicht HttpServletRequest, ModelMap und so weiter), es wie @ModelAttribute -annotated Argument behandelt wird.

So wird @ModelAttribute effektiv in zwei Fällen erforderlich:

  • Um Namen des Attributs angeben. Wenn @ModelAttribute weggelassen wird oder die leere value hat, wird der Standardname verwendet (geben Sie den Namen des Arguments mit dem ersten dekapitalisierten Buchstaben ein).

  • Wenn der Typ des Arguments eine besondere Bedeutung hat. Wenn Ihr Domänenobjekt beispielsweise als Attribut extends java.security.Principal übergeben wird, müssen Sie es annotieren, andernfalls wird Spring stattdessen ein Ergebnis HttpServletRequest.getUserPrincipal() übergeben.

Manche Menschen neigen dazu @ModelAttribute ohne tatsächlichen Bedarf, um die Bedeutung der Argumente zu dokumentieren, zu verwenden.