2010-01-19 53 views
7

我覺得我會在spring mvc中混淆會話註釋。Spring 3中的默認對象mvc會話過期時的SessionAttributes

我有這樣的代碼(2個步驟,形成樣品,步驟1中的用戶數據,第2步地址)

@SessionAttributes({"user", "address"}) 
public class UserFormController { 

    @RequestMapping(method = RequestMethod.GET) 
    public ModelAndView show(ModelAndView mv){ 
     mv.addObject(new User()); 
     mv.addObject(new Address()); 
     mv.setViewName("user_add_page"); 
     return mv; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String processForm(User user, BindingResult result){ 
     new UserValidator().validate(user, result); 
     if(result.hasErrors()){ 
      return "user_add_page"; 
     }else{ 
      return "redirect:/user_form/user_add_address"; 
     } 

// ......... 
} 

現在,如果我的會話過期後,我得到的錯誤,我提交頁面

組織.springframework.web.HttpSessionRequiredException: 會話屬性 '用戶' 需要 - 在會議上未發現

我該如何處理?我想有2個選項

  1. 我創建空的對象,如果缺少在會議並接受提交
  2. 我向前回用戶的形式與一些消息

我還在學習春天的早期階段非常抱歉,如果它的東西很明顯,我只是不能看到它。

ps。即使是在春季mvc解決這種形式的好方法,或者你會推薦不同的方法嗎?

回答

4

1.I創建空的對象一些消息

使用@ExceptionHandler(HttpSessionRequiredException.class) -annotated方法

+0

在'processForm'方法的'User'屬性中添加'@ ModelAttribute'。 – 2013-10-31 12:19:22

0

根據Spring 3.0 reference manual,它看起來像@SessionAttributes是用於你希望在會話中透明地存儲的類型,例如「命令」或形式支持對象。我認爲你不想在會話中存儲控制器。如果缺少在會議並接受提交

使用@ModelAttribute("user") -annotated方法提供的默認值

2.I着回用戶形式

+0

hymmm ......不,我不是故意要存儲控制器會話。 我的問題是,一旦你的會話到期你的用戶和地址對象(常規數據持有豆)爲空。 我周圍有 \t @ExceptionHandler(HttpSessionRequiredException.class) \t公共ModelAndView的handleException(){ \t \t ModelAndView的MV =新的ModelAndView( 「重定向:/ user_form」); \t \t mv.addObject(new User()); \t \t mv。addObject(new Address()); \t \t return mv; \t} 但它並不完全符合我的想法,我希望得到一些更清晰的解決方案 – Art79 2010-01-19 15:51:27

+0

'@ SessionAttributes'用於配置要在會話中存儲哪些對象。它並不表示Controller是會話綁定的(因爲有一個'@範圍'註釋)。 – 2013-10-31 12:18:19

1

嘗試點擊這裏:

http://forum.springsource.org/showthread.php?t=63001&highlight=HttpSessionRequiredException

@Controller 
@RequestMapping(value="/simple_form") 
@SessionAttributes("command") 
public class ChangeLoginController { 

    @ModelAttribute("command") 
    public MyCommand createCommand() { 
    return new MyCommand(); 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public String get() {  
     return "form_view"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String post(@ModelAttribute("command") MyCommand command) { 
     doSomething(command); // execute business logic 
     return "form_view"; 
    } 
}