2010-10-25 6 views
5

J'ai une classe de soutien du contrôleur abstrait pour les recherches et les listes de résultats:Spring MVC: @SessionAttributes partagé entre les contrôleurs?

@Controller 
@SessionAttributes("query") 
public abstract class SearchController<Q extends SearchQuery> { 
    @RequestMapping 
    public String performSearch(@ModelAttribute("query") Q query) { 
     .... 
    } 

    @ModelAttribute("query") 
    public abstract Q createDefaultSearchQuery(); 
} 

Plusieurs contrôleurs de recherche réels étendent cette classe de base.

Après avoir accédé à l'un des contrôleurs (disons /searchBooks.html en utilisant BookSearchQuery implements SearchQuery), la requête est correctement stockée dans la session, disponible pour les demandes suivantes.

Cependant, depuis la dernière demande (BookSearchQuery) quand j'accéder à un autre contrôleur (par exemple en utilisant /searchAuthors.htmlAuthorSearchQuery implements SearchQuery) la requête est encore utilisé pour le nouveau contrôleur provoquant une ClassCastException plus tard.

J'ai essayé de déplacer l'annotation @SessionAttribute de la classe de support vers les classes d'implémentation, en vain.

Y at-il quelque chose que je fais mal ou est-ce par conception? Que puis-je faire?

Merci beaucoup!

Répondre

0

En utilisant @SessionAttributes ces objets seront stockés dans votre HttpSession avec le même nom et ils seront accessibles (partagés) à partir de différents contrôleurs. Ainsi, le printemps agit correctement.

Je pense que la meilleure approche dans votre scénario est de renommer cet attribut dans chaque sous-classe ("BookQuery", "AutorQuery", ...). Pas très élégant du tout :(

+0

I J'avais espéré que Spring qualifierait le nom de l'attribut dans le contexte de la session avec le nom du contrôleur Je ne peux pas renommer le nom de l'attribut car j'utilise le nom du bean modèle ("query") dans les méthodes du contrôleur abstrait. Des idées? –

+0

Désolé, aucune idée, et je pense que ce que vous voulez n'est pas possible – sinuhepop

+0

Très triste ... Merci beaucoup! –

4

Je viens d'essayer ce printemps sur 3.0.2 et les attributs de session ne sont pas partagés entre les contrôleurs. En fait, je cherchais l'effet inverse et comment je l'ai découvert.

Questions connexes