簡體   English   中英

添加RedirectAttributes參數會導致Spring MVC控制器方法中的“模型沒有鍵值”異常

[英]Adding RedirectAttributes parameter causes “Model has no value for key” exception in Spring MVC controller method

我有以下Spring MVC控制器方法:

@RequestMapping(value = "/tournament/{id}/set-format", method = RequestMethod.POST)
public String processSetTournamentFormat(Model model,
                                         @ModelAttribute("formatSettings") FormatSettings formatSettings,
                                         @AuthenticationPrincipal UserAccount currentUser,
                                         @PathVariable("id") int tournamentId,
                                         RedirectAttributes redirectAttributes)
        throws TournamentAccessDenied, TournamentNotFoundException, ModifyngOngoingTournamentException {

    Tournament currentTournament = tournamentManagementService.findTournamentById(tournamentId);

    tournamentManagementService.setTournamentFormat(currentTournament, formatSettings);

    model.addAttribute("tournamentId", currentTournament.getId());

    return "redirect:/tournament/{tournamentId}/setup";
}

當我點擊相應表單中的提交按鈕時,我得到一個例外:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Model has no value for key 'tournamentId'
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)
javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316)
[...]

當我刪除redirectAttributes參數時,一切都很好,但是我需要它來添加flash屬性以防出現任何錯誤。 我試着理解為什么URL模板不起作用。 在沒有刪除redirectAttributes的情況下我也可以使用:

return "redirect:/tournament/" + currentTournament.getId() + "/setup";

我的Spring版本是4.1.7

在處理程序方法中提供ModelRedirectAttributes參數毫無意義。 RedirectAttributes可以完成Model可以做的所有事情。

實際問題如下:

  1. Spring MVC請求處理過程使用單個ModelAndViewContainer來保存對Model的引用。
  2. 為了向處理程序方法提供Model參數,Spring MVC返回ModelAndViewContainer的默認Model
  3. 為了向handle方法提供RedirectAttributes參數,Spring MVC創建了一個新實例並使用它來覆蓋默認的ModelAndViewContainer Model
  4. 將屬性添加到ModelModelAndViewContainer將無法訪問它,因此處理redirect:組件也不會redirect:視圖名稱。

選一個。 你不需要兩者。

redirectAttributes.addAttribute("tournamentId", currentTournament.getId());

暫無
暫無

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

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