处理重叠的@SessionAttributes名称?

时间:2019-02-02 03:15:14

标签: java spring spring-mvc session

我如何才能做到@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";
    }
}

1 个答案:

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