У меня есть объект формы, который я установил для запроса в, ПОЛУЧАЮТ обработчик запросов в моем контроллере Spring. Новый пользователь входит в страницу, новый объект формы должен быть сделан и установлен запросить. Если пользователь отправляет форму, то объект формы заполняется от запроса, и теперь объект формы имеет всего пользователя givern атрибуты. Затем форма проверена и если проверка в порядке, то сформируйтесь, сохраняется к базе данных. Если форма не проверена, я хочу сохранить объект формы к сессии и затем перенаправить для ПОЛУЧЕНИЯ страницы обработки запроса. Когда запрос перенаправляется для ПОЛУЧЕНИЯ обработчика, затем он должен проверить, содержит ли сессия объект формы.
Я выяснил, что существует @SessionAttributes ("форма") аннотация в Spring, но по некоторым причинам следующее не работает, потому что в первый раз, форма атрибута сессии является пустой, и это дает ошибку:
org.springframework.web.HttpSessionRequiredException: Session attribute 'form' required - not found in session
Вот мой контроллер:
@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;
}
Задача @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
}
}
Обратите внимание, что @SessionAttributes
объявлен в классе, а не в методе. На самом деле, вы можете поставить, где хотите, но я думаю, что это имеет больше смысла в классе.
На мой взгляд, документация по этому могла бы быть намного яснее.