2010-02-09 22 views
14

Quiero leer un objeto de dominio (UserVO) desde el alcance de la sesión.Spring 3.0 establece y obtiene el atributo de sesión

estoy fijando la UserVO en un controlador llamado WelcomeController

@Controller 
@RequestMapping("/welcome.htm") 
public class WelcomeController { 
@RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(BindingResult result, SessionStatus status,HttpSession session){ 
     User user = loginService.loginUser(loginCredentials); 
    session.setAttribute("user", user); 
     return "loginSuccess"; 
    } 
} 

Soy capaz de utilizar el objeto en páginas JSP <h1>${user.userDetails.firstName}</h1>

Pero no soy capaz de leer el valor de otro controlador,

estoy tratando de leer el atributo de sesión de la siguiente manera:

@Controller 
public class InspectionTypeController { 
@RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST) 
public String addInspectionType(InspectionType inspectionType, HttpSession session) 
{ 
      User user = (User) session.getAttribute("user"); 
      System.out.println("User: "+ user.getUserDetails().getFirstName); 

     } 
} 
+0

¿Cómo no puede? cuál es el problema exacto – Bozho

+0

Tengo el mismo problema para usted ahora. ¿Encontraste alguna otra solución? –

Respuesta

39

El código que ha mostrado debe funcionar - el HttpSession es compartido entre los controladores, y está usando el mismo nombre de atributo. Por lo tanto, algo más va mal que no nos estás mostrando.

Sin embargo, independientemente de si funciona o no, Spring ofrece un enfoque más elegante para mantener sus objetos modelo en la sesión, utilizando la anotación @SessionAttribute (consulte docs).

Por ejemplo (no he probado esto, pero te da la idea):

@Controller 
@RequestMapping("/welcome.htm") 
@SessionAttributes({"user"}) 
public class WelcomeController { 
    @RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(ModelMap modelMap){ 
     User user = loginService.loginUser(loginCredentials); 
     modelMap.addtAttribute(user); 
     return "loginSuccess"; 
    } 
} 

y luego

@Controller 
@SessionAttributes({"user"}) 
public class InspectionTypeController { 

    @RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST) 
    public void addInspectionType(InspectionType inspectionType, @ModelAttribute User user) { 
     System.out.println("User: "+ user.getUserDetails().getFirstName); 
    } 
} 

Sin embargo, si el código original no está funcionando, entonces esto tampoco funcionará, ya que algo más está mal en su sesión.

+1

Vine aquí buscando la primera solución ('@ SessionAttributes') y todo lo que obtuve fue' java.lang.IllegalStateException: No se puede crear una sesión después de que se haya confirmado la respuesta' –

+1

Esto parece contradecir lo que dice @karpaczio ... ¿Alguien puede confirmar cuál es correcto? Creo que los atributos de la sesión se comparten independientemente del '@ Controller' en cuestión, pero no me he adentrado en el funcionamiento interno de' @ SessionAttribute'. – Andy

+2

@Andy Ver mi comentario en la respuesta de karpaczio –

6

@SessionAttributes funciona solo en el contexto de un manejador particular, por lo que los atributos establecidos en WelcomeController serán visibles solo en este controlador.

+5

Lo que dices es el caso de las versiones de Spring <= 3.1.2.RELEASE. A partir de 3.1.2.RELEASE, @SessionAttributes persisten entre diferentes controladores como se esperaba –

+1

@Denis Kniazhev ver [aquí] (http://docs.spring.io/spring-framework/docs/3.2.0.M2/api/ org/springframework/web/bind/annotation/SessionAttributes.html) Use los atributos SessionAttributes para dichos atributos conversacionales que se supone deben almacenarse temporalmente en la sesión durante el curso de una conversación específica del manejador. Para atributos de sesión permanentes, p. un objeto de autenticación de usuario, use el método tradicional session.setAttribute en su lugar. – lolotron

2

Utilice una clase principal para heredar todos los controladores y utilizar SessionAttributes allí. Solo que esta clase debería estar en el paquete de exploración de mvc.

0

Puede ser que no haya configurado su UserVO como Serializable.

Cuestiones relacionadas