Quand dois - @SessionAttributes dans spring mvc supprimé? (Avec le code de l'échantillon)
Dans quelles circonstances exactes n' @SessionAttributes obtenir effacée? J'ai découvert quelques confus de comportement lors de l'utilisation de deux modèles dans une page.
Quand je fais un suivi par un POST à l'aide de ce contrôleur...
@Controller
@RequestMapping("/myPage*")
@SessionAttributes(value = {"object1", "object2"})
public class MyController {
@RequestMapping(method = RequestMethod.GET)
public String get(Model model) {
model.addAttribute("object1", new Object1());
model.addAttribute("object2", new Object2());
return "myPage";
}
@RequestMapping(method = RequestMethod.POST)
public String post(@ModelAttribute(value = "object1") Object1 object1) {
//do something with object1
return "myPage";
}
}
...objet2 est effacée à partir du Modèle. Il n'existe plus en tant que @SessionAttribute et ne peut pas être consulté sur ma page d'affichage.
Toutefois, si la signature de la seconde méthode est modifié de façon à ce...
public String post(@ModelAttribute(value = "object1") Object1 object1,
@ModelAttribute(value = "object2") Object2 object2) {
...puis objet2 ne pas obtenir effacée du modèle et est disponible sur ma page d'affichage.
La javadoc de @SessionAttributes dit:
... attributs seront supprimés une fois
le gestionnaire indique la fin de
sa session de conversation.
Mais je ne vois pas comment je l'ai indiqué à l'achèvement de la session de conversation dans le premier exemple, mais pas dans le deuxième exemple.
Quelqu'un peut expliquer ce comportement ou est-ce un bug?
OriginalL'auteur Daniel Alexiuc | 2009-09-03
Vous devez vous connecter pour publier un commentaire.
Vous indiquer la fin de la conversation en appelant
SessionStatus.setComplete
Cela dit, je ne vois pas pourquoi il devrait être de perdre un attribut de modèle et pas l'autre.
Avez-vous essayé de faire quelque chose comme:
Et de voir comment cela se compare à mettre les attributs dans le modèle à la main.
Hélas j'ai fait un boo-boo. À partir de la référence (3.0.0.M3): "Note: @ModelAttribute annoté méthodes seront exécutées avant le choisi @RequestMapping annoté méthode de gestionnaire". Donc, la raison qui fonctionne est que l'objet1 et objet2 méthodes sont exécutées avant à la fois les méthodes get et post. Cela peut effectivement être ce que vous voulez, mais je pense que non.
Oui, j'ai réalisé que juste après que j'ai posté mon commentaire. Je pourrais soulever ce Printemps que je ne vois aucune explication raisonnable à ce comportement.
Cette Question a été soulevée avec le Printemps: jira.springframework.org/browse/SPR-6084
Ce problème a été résolu au Printemps 3.0RC1. Grâce Juergen!
OriginalL'auteur ptomli
Vous pouvez supprimer une séance unique de niveau ModelAttribute comme ceci:
Donné
ModelMap model
,HttpSession session
et vous n':OriginalL'auteur Michaelzh