2010-10-25 12 views
5

Ich habe eine abstrakte Controller-Support-Klasse für die Suche und Ergebnislisten:Spring MVC: @SessionAttributes zwischen den Controllern geteilt?

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

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

Mehrere eigentlichen Such Controller erweitern diese Basisklasse.

Nach dem Zugriff auf einen der Controller (z. B. /searchBooks.html mit BookSearchQuery implements SearchQuery) wird die Abfrage in der Sitzung korrekt gespeichert und ist für nachfolgende Anforderungen verfügbar.

Allerdings, wenn ich einen anderen Controller zugreifen (zB /searchAuthors.html mit AuthorSearchQuery implements SearchQuery) die Abfrage aus der letzten Anfrage (BookSearchQuery) noch für den neuen Controller verwendet wird, auf eine ClassCastException später verursacht.

Ich habe versucht, die @SessionAttribute Annotation von der Support-Klasse zu den Implementierungsklassen zu verschieben, ohne Erfolg.

Gibt es etwas, was ich falsch mache, oder ist das von Entwurf? Was kann ich tun?

Vielen Dank!

Antwort

0

Mit @SessionAttributes werden diese Objekte in Ihrer HttpSession mit dem gleichen Namen gespeichert und sie sind von verschiedenen Controllern zugänglich (freigegeben). Also, Spring ist richtig.

Ich denke, der beste Ansatz in Ihrem Szenario ist, dieses Attribut in jeder Unterklasse ("BookQuery", "AutorQuery", ...) umzubenennen. Nicht sehr elegant an allen :(

+0

I hatte gehofft Spring würde den Namen des Attributs im Sitzungskontext irgendwie mit dem Controllernamen qualifizieren Ich kann den Attributnamen nicht umbenennen, weil ich den Model-Bean-Namen ("query") in den Methoden des abstrakten Controllers verwende. Irgendwelche Ideen? –

+0

Sorry, keine Ideen, und ich denke, was Sie wollen, ist nicht möglich .. – sinuhepop

+0

Sehr traurig ... Vielen Dank! –

4

Ich habe gerade versucht dies auf Frühling 3.0.2 und die Sitzungsattribute nicht geteilt werden zwischen den Controllern. In der Tat suchte ich die entgegengesetzte Wirkung und das ist, wie ich herausgefunden habe.

Verwandte Themen