[英]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
在處理程序方法中提供Model
和RedirectAttributes
參數毫無意義。 RedirectAttributes
可以完成Model
可以做的所有事情。
實際問題如下:
ModelAndViewContainer
來保存對Model
的引用。 Model
參數,Spring MVC返回ModelAndViewContainer
的默認Model
。 RedirectAttributes
參數,Spring MVC創建了一個新實例並使用它來覆蓋默認的ModelAndViewContainer
Model
。 Model
, ModelAndViewContainer
將無法訪問它,因此處理redirect:
組件也不會redirect:
視圖名稱。 選一個。 你不需要兩者。
redirectAttributes.addAttribute("tournamentId", currentTournament.getId());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.