【问题标题】:Default objects in spring 3 mvc SessionAttributes when session expired会话过期时 Spring 3 mvc SessionAttributes 中的默认对象
【发布时间】:2011-01-06 20:12:01
【问题描述】:

我认为我对 spring mvc 中的会话注释有点困惑。

我有这样的代码(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";
        }

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

现在,如果我在会话过期后提交页面,我会收到错误

org.springframework.web.HttpSessionRequiredException: 需要会话属性“用户”- 在会话中找不到

我该如何处理?我想要两个选项

  1. 如果在会话中丢失,我会创建空对象并接受提交
  2. 我通过一些消息转发回用户表单

我还处于学习Spring的早期阶段,很抱歉,如果它很明显,我看不到。

ps。这是在spring mvc中解决这种形式的好方法还是你会推荐不同的方法?

【问题讨论】:

    标签: java spring spring-mvc session


    【解决方案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";
        }
    }
    

    【讨论】:

      【解决方案2】:

      1.如果在会话中丢失,我创建空对象并接受提交

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

      2.i 通过一些消息转发回用户表单

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

      【讨论】:

      • processForm方法的User属性旁边添加@ModelAttribute
      【解决方案3】:

      根据Spring 3.0 reference manual,看起来@SessionAttributes 旨在用于您希望在会话中透明存储的类型,例如“命令”或表单支持对象。我认为您不想在会话中存储控制器。

      【讨论】:

      • hymmm ...不,我不是要在会话中存储控制器。我的问题是,一旦您的会话到期,您的用户和地址对象(常规数据保存 bean)为空。我用 @ExceptionHandler(HttpSessionRequiredException.class) public ModelAndView handleException(){ ModelAndView mv = new ModelAndView("redirect:/user_form"); mv.addObject(新用户()); mv.addObject(新地址());返回 mv; } 但它并不完全是我的想法,我希望有一些更清洁的解决方案
      • @SessionAttributes 用于配置要在会话中存储哪些对象。它并不表示控制器是会话绑定的(因为有一个@Scope 注释)。
      猜你喜欢
      • 2011-11-18
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多