Spring Framework 3和会话属性

new*_*bie 22 session spring-mvc

我有我在Spring控制器中的GET请求处理程序中请求的表单对象.第一次用户进入页面时,应该创建一个新的表单对象并设置为request.如果用户发送表单,则表单对象将从请求中填充,现在表单对象具有所有用户givern属性.然后验证表单,如果验证正常,则将表单保存到数据库.如果未验证表单,我想将表单对象保存到会话,然后重定向到GET请求处理页面.当请求被重定向到GET处理程序时,它应该检查session是否包含表单对象.

我已经发现Spring中有@SessionAttributes("form")注释,但由于某些原因,后续工作无效,因为第一次会话属性形式为null并且它给出了错误:

org.springframework.web.HttpSessionRequiredException: Session attribute 'form' required - not found in session
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

@RequestMapping(value="form", method=RequestMethod.GET)
public ModelAndView viewForm(@ModelAttribute("form") Form form) {
    ModelAndView mav = new ModelAndView("form");      
    if(form == null) form = new Form();
    mav.addObject("form", form);
    return mav;
}

@RequestMapping(value="form", method=RequestMethod.POST)
@Transactional(readOnly = true)
public ModelAndView saveForm(@ModelAttribute("form") Form form) {
    FormUtils.populate(form, request);
    if(form.validate())
    {
        formDao.save();         
    }
    else 
    {
        return viewForm(form);
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

dig*_*666 32

如果控制器第一次调用它,即使将@SessionAttributes({"form"})添加到类中,它也会抛出异常.因此,添加以下populateForm方法将解决此问题.

@SessionAttributes({"form"})
@Controller
public class MyController {

   @ModelAttribute("form")
   public Form populateForm() {
       return new Form(); // populates form for the first time if its null
   }

   @RequestMapping(value="form", method=RequestMethod.GET)
   public ModelAndView viewForm(@ModelAttribute("form") Form form) {
       ModelAndView mav = new ModelAndView("form");      
       if(form == null) form = new Form();
       mav.addObject("form", form);
       return mav;
   }

   @RequestMapping(value="form", method=RequestMethod.POST)
   @Transactional(readOnly = true)
   public ModelAndView saveForm(@ModelAttribute("form") Form form) {
      // ..etc etc
   }
}
Run Code Online (Sandbox Code Playgroud)

  • +1,这是我到目前为止看到的最好的解决方法,直到spring决定添加`@ModelAttribute(required = false)`. (12认同)

ska*_*man 25

工作@SessionAttribute是将现有模型对象绑定到会话.如果它尚不存在,则需要定义它.在我看来,这是不必要的混淆,但尝试这样的事情:

@SessionAttributes({"form"})
@Controller
public class MyController {

   @RequestMapping(value="form", method=RequestMethod.GET)
   public ModelAndView viewForm(@ModelAttribute("form") Form form) {
       ModelAndView mav = new ModelAndView("form");      
       if(form == null) form = new Form();
       mav.addObject("form", form);
       return mav;
   }

   @RequestMapping(value="form", method=RequestMethod.POST)
   @Transactional(readOnly = true)
   public ModelAndView saveForm(@ModelAttribute("form") Form form) {
      // ..etc etc
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,在@SessionAttributes类上声明,而不是方法.你可以把它放在任何你喜欢的地方,但我觉得它在课堂上更有意义.

在我看来,关于这方面的文件可能会更加清晰.

  • 如果spring要实现允许访问会话属性的方法参数注释(以与访问请求参数相同的方式),这将非常有用.`public void doSometing(@SessionAttribute("cat")Cat cat){` (6认同)