[英]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.