web-dev-qa-db-fra.com

Spring 3.0 set et get attribut de session

Je veux lire un objet de domaine (UserVO) à partir de la portée de la session.

Je configure UserVO dans un contrôleur appelé 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";
    }
}

Je suis capable d'utiliser l'objet dans les pages jsp <h1>${user.userDetails.firstName}</h1>

Mais je ne suis pas capable de lire la valeur d'un autre contrôleur,

J'essaie de lire l'attribut de session comme suit:

@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);

        }
} 
14
binary

Le code que vous avez montré devrait fonctionner - la HttpSession est partagée entre les contrôleurs et vous utilisez le même nom d'attribut. Ainsi, il se passe quelque chose d'autre que vous ne nous montrez pas.

Cependant, que cela fonctionne ou non, Spring propose une approche plus élégante pour conserver vos objets de modèle dans la session, en utilisant l'annotation @SessionAttribute (voir docs ).

Par exemple (je n'ai pas testé cela, mais ça vous donne une idée):

@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";
    }
}

et alors

@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);
   }
} 

Cependant, si votre code d'origine ne fonctionne pas, cela ne fonctionnera pas non plus, car il y a quelque chose de mal avec votre session.

40
skaffman

@SessionAttributes ne fonctionne que dans le contexte d'un gestionnaire particulier, les attributs définis dans WelcomeController ne seront visibles que dans ce contrôleur. 

6
karpaczio

Utilisez une classe parent pour hériter de tous les contrôleurs et utilisez SessionAttributes là-bas. Juste que cette classe devrait être dans l'analyse de package de mvc.

2

Il se peut que vous n’ayez pas configuré votre UserVO en tant que Serializable.

0
Anil Bhargava