Java 处理重叠的@SessionAttributes名称?
如何使Java 处理重叠的@SessionAttributes名称?,java,spring,spring-mvc,session,Java,Spring,Spring Mvc,Session,如何使@SessionAttributes的范围限定在各自的控制器上,或者在过早地在控制器之间切换工作流时清理@SessionAttributes 例如: 用户转到网页编辑词典,进入DictionaryController.java,它创建一个DictionaryForm.java对象,并将其存储在“表单”下的@SessionAttributes中 通常,在GET请求中获取字典条目,然后在POST时更新,并在成功时调用status.setComplete() 但是,如果用户执行GET请求,然后单
@SessionAttributes
的范围限定在各自的控制器上,或者在过早地在控制器之间切换工作流时清理@SessionAttributes
例如:
用户转到网页编辑词典,进入DictionaryController.java
,它创建一个DictionaryForm.java
对象,并将其存储在“表单”下的@SessionAttributes
中
通常,在GET请求中获取字典条目,然后在POST时更新,并在成功时调用status.setComplete()
但是,如果用户执行GET请求,然后单击转到另一个页面,例如OrganizationController.java
,则第二个控制器似乎试图重用来自另一个控制器的“form”@SessionAttribute
对象,并且在它到达getOrganization()
方法之前将失败。(由于我的eclipse控制台没有输出任何异常,所以它失败的具体原因尚未确定,但我怀疑这是因为表单类型不匹配)
我最终使用的解决方案是拥有一个所有表单类型都继承自的
BaseForm
对象类型。然后,在GET请求的请求映射方法中,我将使用@modeldattribute(“form”)BaseForm form
并手动检查方法体中的表单类型,如果不匹配,则将其转换并在会话中还原。(如果将其附加到请求的模型对象,则可能不需要在会话中替换它)
即
我想到的解决方法是:通过隐藏输入(可能的数据泄漏)在html页面中包含整个表单,在每个步骤中从数据库加载对象(不幸的是,对象加载通常很复杂),使用不同的名称存储每个表单(大量的会话混乱),手动管理会话并显式处理控制器方法中的冲突,使每个表单具有相同的类型(重要的代码重写)
@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";
}
}
@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";
}