我认为我对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: 会话属性'user'必需 - 在会话中找不到
我该如何处理?我想有2个选项
我还处于学习Spring的早期阶段,很抱歉,如果它非常明显,我就是看不到它。
PS。甚至是在春季mvc解决这种形式的好方法,还是你会推荐不同的方法?
答案 0 :(得分:4)
1.i如果会话中缺少则创建空对象并接受提交
使用@ModelAttribute("user")
- 带注释的方法提供默认值
2.i使用一些消息转发回用户表单
使用@ExceptionHandler(HttpSessionRequiredException.class)
- 带注释的方法
答案 1 :(得分: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 :(得分:0)
根据Spring 3.0 reference manual,看起来@SessionAttributes用于要在会话中透明存储的类型,例如“Command”或表单支持对象。我认为您不希望将Controller存储在会话中。