2010-10-25 21 views
5

tengo una clase de soporte para el controlador abstracto para las búsquedas y las listas de resultados:Spring MVC: @SessionAttributes compartido entre los controladores?

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

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

Varios controladores de búsqueda reales se extienden esta clase base.

Después de haber accedido a uno de los controladores (digamos /searchBooks.html usando BookSearchQuery implements SearchQuery) la consulta se almacena correctamente en la sesión, disponible para solicitudes posteriores.

Sin embargo, cuando accedo a otro controlador (por ejemplo usando /searchAuthors.htmlAuthorSearchQuery implements SearchQuery) la consulta desde la última solicitud (BookSearchQuery) se sigue utilizando para el nuevo controlador causando una ClassCastException más adelante.

He intentado mover la anotación @SessionAttribute de la clase de soporte a las clases de implementación, fue en vano.

¿Hay algo que estoy haciendo mal o es esto por diseño? ¿Que puedo hacer?

¡Muchas gracias!

Respuesta

0

Usando @SessionAttributes estos objetos se almacenarán en su HttpSession con el mismo nombre y serán accesibles (compartidos) desde diferentes controladores. Entonces, Spring está actuando correctamente.

Creo que el mejor enfoque en su escenario es cambiar el nombre de este atributo en cada subclase ("BookQuery", "AutorQuery", ...). No es muy elegante en absoluto :(

+0

I había esperado que Spring calificara de alguna manera el nombre del atributo en el contexto de la sesión con el nombre del controlador. No puedo renombrar el nombre del atributo porque estoy usando el nombre del bean modelo ("consulta") en los métodos del controlador abstracto. ¿Alguna idea? –

+0

Disculpe, no tengo ideas, y creo que lo que quiere no es posible. – sinuhepop

+0

Muy triste ... ¡Muchas gracias! –

4

Acabo de intentar esto en primavera 3.0.2 y los atributos de la sesión no se comparten entre controladores. De hecho, yo estaba buscando el efecto contrario y así fue como me enteré.

Cuestiones relacionadas