Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理重叠的@SessionAttributes名称?_Java_Spring_Spring Mvc_Session - Fatal编程技术网

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";
    }