Spring 3.0 устанавливает и получает атрибут сессии - PullRequest
14 голосов
/ 09 февраля 2010

Я хочу прочитать объект домена (UserVO) из области сеанса.

Я устанавливаю UserVO в контроллере с именем 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";
    }
}

Я могу использовать объект вjsp pages <h1>${user.userDetails.firstName}</h1>

Но я не могу прочитать значение из другого контроллера,

Я пытаюсь прочитать атрибут сеанса следующим образом:

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

        }
} 

Ответы [ 4 ]

40 голосов
/ 09 февраля 2010

Код, который вы показали , должен работать - HttpSession совместно используется контроллерами, и вы используете одно и то же имя атрибута. Таким образом, что-то еще идет не так, что вы нам не показываете.

Однако независимо от того, работает он или нет, Spring предоставляет более элегантный подход к сохранению объектов модели в сеансе, используя аннотацию @SessionAttribute (см. docs ).

Например (я не проверял это, но это дает вам идею):

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

, а затем

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

Однако, если ваш исходный код не работает, он тоже не будет работать, поскольку в вашем сеансе что-то не так.

6 голосов
/ 23 февраля 2012

@ SessionAttributes работает только в контексте определенного обработчика, поэтому атрибут, установленный в WelcomeController, будет виден только в этом контроллере.

2 голосов
/ 26 мая 2012

Используйте родительский класс для наследования всех контроллеров и использования там атрибутов SessionAttributes. Просто этот класс должен быть в пакете сканирования mvc.

0 голосов
/ 01 мая 2014

Может быть, вы не установили свой UserVO как Serializable.

...