簡體   English   中英

Spring MVC-@SessionAttributes和status.setComplete()

[英]Spring MVC - The @SessionAttributes and status.setComplete()

我面臨着一個我真的不知道該如何解決的問題。 我正在開發一個Bug跟蹤器(僅供學習)。 我有一個頁面可以創建一個新問題,一個頁面可以編輯一個問題。 兩者目前都有自己的控制器。

EditIssueController.java

@Controller
@RequestMapping(value = "/issues/{issueId}")
@SessionAttributes("issuePackage")
public class EditIssueController {

    @Autowired
    private IssueService issueService;

    [...]

    @ModelAttribute("issuePackage")
    public IssueTagEnvironment populateIssue (@PathVariable("issueId") Integer issueId) {

        IssueTagEnvironment issueTagEnv = new IssueTagEnvironment();
        issueTagEnv.setIssue(issueService.getIssueById(issueId));

        return issueTagEnv;
    }

    @InitBinder
    public void initBinder (WebDataBinder binder) {

        [...]
    }

    @RequestMapping(value = "/edit", method = RequestMethod.GET)
    public ModelAndView editIssue (@PathVariable("issueId") Integer issueId,
                                   @ModelAttribute("issuePackage") IssueTagEnvironment issuePackage) {

        ModelAndView mav = new ModelAndView("/issues/EditIssue");

        [...]

        IssueTagEnvironment issueTagEnv = new IssueTagEnvironment();
        issueTagEnv.setIssue(issueService.getIssueById(issueId));

        [...]
        mav.addObject("issuePackage", issueTagEnv);

        return mav;
    }

    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    public String updateIssue (@ModelAttribute("issuePackage") IssueTagEnvironment issuePackage,
                               BindingResult result) {

        if (result.hasErrors() == true) {
            return "redirect:/issues/{issueId}/edit";
        }

        issueService.updateIssue(issuePackage.getIssue());

        return "redirect:/issues/{issueId}";
    }
}

CreateIssueController.java

@Controller
@SessionAttributes("issuePackage")
public class CreateIssueController {

    @Autowired
    private IssueService issueService;

    [...]

    @ModelAttribute("issuePackage")
    public IssueTagEnvironment populateNewIssue () {

        return new IssueTagEnvironment();
    }

    @InitBinder
    public void initBinder (WebDataBinder binder) {

        [...]
    }

    @RequestMapping(value = "/issues/CreateIssue", method = RequestMethod.GET)
    public ModelAndView createIssueGet (@ModelAttribute("issuePackage") IssueTagEnvironment issuePackage) {

        ModelAndView mav = new ModelAndView("/issues/CreateIssue");

        [...]

        issuePackage.getIssue().setReporter(SecurityUtils.getCurrentUser());

        return mav;
    }

    @RequestMapping(value = "/issues/CreateIssue", method = RequestMethod.POST)
    public String createIssuePost (@ModelAttribute("issuePackage") IssueTagEnvironment issuePackage,
                                   BindingResult result,
                                   SessionStatus status) {

        if (result.hasErrors() == true) {
            return "redirect:/issues/CreateIssue";
        }

        [...]

        issueService.createIssue(issuePackage.getIssue());

        status.setComplete();
        return "redirect:/issues/" + issuePackage.getIssue().getId();
    }

}

到目前為止,一切似乎都是正確的(並且確實可行)。 但是這是龍:

  • 我在“編輯”頁面中,可更改現有問題的數據。
  • 我決定不提交更改,而是決定從導航器中按“返回”按鈕。
  • 在該操作(返回)之后,我決定創建一個新的問題,然后...就在這里! 創建新問題的表單並非空白,而是充滿了先前“已編輯但未提交”問題的信息。

我了解問題所在: controller未通過執行status.setComplete()來完成會話/狀態。

我的問題是,如何解決這個問題?

在此先感謝社區!

對於您當前的示例,很容易修復,只需將createIssueGet方法更改為:

public ModelAndView createIssueGet () {

    ModelAndView mav = new ModelAndView("/issues/CreateIssue");
    IssueTagEnvironment issuePackage = new IssueTagEnvironment();

    ModelAndView mav = new ModelAndView("/issues/CreateIssue");
    mav.addAttribute("issuePackage", issuePackage);

    [...]

    [...]
}

這樣,您可以確保始終在該控制器中使用新的IssueTagEnvironment對象。 Spring將其放入會話中,就像您將其放入模型中一樣。

但問題依然存在:如果不正確地調用status.setComplete()你在會議的對象, 應該存在離開,像你說的龍可能有

出於這個原因,我停止使用@SessionAttributes ,而僅使用一個隱藏字段(用於id)和一個使用服務層從id到完整對象的Converter ,希望它應該在緩存中並且不會訪問數據庫。 不太好,但也不比這差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM