我如何才能做到@SessionAttributes
的作用域仅限于其各自的控制器,或者在过早地在控制器之间切换工作流程时清理@SessionAttributes
?
示例:
用户转到网页以编辑字典,然后进入DictionaryController.java
,该字典创建一个DictionaryForm.java
对象,并将其存储在@SessionAttributes
下的“表单”下
通常,在GET请求中获取字典条目,然后在POST上进行更新,并在成功时调用status.setComplete()
;
但是,如果用户执行GET请求,则单击鼠标移至另一个页面,例如OrganizationController.java
,第二个控制器似乎试图重用另一个控制器的“ form” @SessionAttribute
对象,并且将失败甚至到达getOrganization()
方法之前。 (由于我的eclipse控制台没有输出任何异常,所以不确定它到底有多准确,但我怀疑这是因为表单类型不匹配)
@SessionAttributes("form")
public class DictionaryController {
@ModelAttribute("form")
public DictionaryForm initForm() {
return new DictionaryForm();
}
@RequestMapping(value="/Dictionary" method=RequestMethod.GET)
public String getDictionary(
@ModelAttribute("form") DictionaryForm form) {
...
return "dictionaryView";
}
@RequestMapping(value="/Dictionary" method=RequestMethod.POST)
public String updateDictionary(
@ModelAttribute("form") DictionaryForm form,
SessionStatus status) {
...
status.setComplete();
return "successView";
}
}
@Controller
@SessionAttributes("form")
public class OrganizationController{
@ModelAttribute("form")
public OrganizationForm initForm() {
return new OrganizationForm();
}
@RequestMapping(value="/Organization" method=RequestMethod.GET)
public String getOrganization(
@ModelAttribute("form") OrganizationForm form) {
...
return "orgView";
}
@RequestMapping(value="/Organization" method=RequestMethod.POST)
public String updateOrganization(
@ModelAttribute("form") OrganizationForm form,
SessionStatus status) {
...
status.setComplete();
return "successView";
}
}
答案 0 :(得分:0)
我最终使用的解决方案是使用BaseForm
对象类型,所有表单类型都继承自该对象类型。然后,在用于GET请求的请求映射方法中,我将使用@ModelAttribute("form") BaseForm form
并手动检查方法主体中的表单类型,如果不匹配,则将其转换并在会话中还原它。 (如果将它附加到请求的模型对象上,则可能无需在会话中替换它)
即。
@RequestMapping(value="/Organization" method=RequestMethod.GET)
public String getOrganization(HttpServletRequest request,
@ModelAttribute("form") BaseForm form) {
if (form.getClass() != OrganizationForm.class) {
form = new OrganizationForm();
request.getSession().setAttribute("form", form);
}
...
return "orgView";
}