2010-01-19 69 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"; 
    } 
}