2010-09-01 17 views
15

En resumen, quiero algo como:Cómo pasar un atributo de sesión como argumento de un método (parámetros) con Spring MVC

public String action(@SessionAttribute User user) {..} 

en lugar de

public String action(HttpSession session) { 
    User user = session.getAttribute("user"); 
} 

Principalmente por el bien de:

  • legibilidad
  • pruebas unitarias
+0

relacionados: http://stackoverflow.com/questions/2213974/spring-mvc-session-attribute-access – Bozho

+0

¿Los beans de alcance de sesión no son lo que necesita? – skaffman

+0

no. ¿Cómo los pasaría como parámetros del método? Y no puedo inyectarlos, porque el controlador es singleton. – Bozho

Respuesta

19

Encontré un solution.

La idea es registrar una costumbre WebArgumentResolver para la AnnotationMethodHandlerAdapter, que maneja una anotación personalizada - @SessionAttribute (o @SessionParam).

Una nota para el código publicado allí es que param.getParameterName() se puede utilizar si no se especifica value.

+0

¿Qué pasa si tiene @SessionAttribute (required = false) Usuario usuario. El valor predeterminado que se devuelve como una cadena no coincide con el usuario. ¿Puedes manejar eso de alguna manera? – mickthompson

+0

puede administrar cualquier cosa en el resolver. :) – Bozho

0

Incluso si usamos @ModelAttribute ("usuario") Usuario como el parámetro del método y luego usamos el objeto del usuario en su método, habrá actualizado al usuario de la sesión. El nombre del atributo debe coincidir con el nombre del atributo de sesión "usuario".

public String myMethod(@ModelAttribute("user") User user){ 

System.out.println(user.getDetails()); 

} 
3

Para los que llegan a través de Google, como de al menos 4.3.2.RELEASE, Primavera incluye un built-in @SessionAttribute anotación:

public String action(
    @SessionAttribute(required=false, name="user") User user) { 

    // ... 

} 

solución Una costumbre ya no es necesario.

Cuestiones relacionadas