假设我有一个用于查看客户的控制器方法,如果他们无权查看该客户,则将错误消息添加为flash属性,然后重定向到区域列表;如果为用户分配了单个区域,则区域处理程序方法将重定向到该区域内的客户列表。
@RequestMapping("/customers/{id}")
public ModelAndView customers(@PathVariable("id") long id,
Principal principal,
RedirectAttributes ra) {
// if user is not allowed
if (!svc.isAccessGrantedToCustomer(principal.getName(), id)) {
ra.addFlashAttribute("errorMessage",
"Access denied for customer " + id + ".");
return new ModelAndView("redirect:/territories");
}
// get customer and return new view...
}
@RequestMapping("/territories")
public ModelAndView territories(Principal principal,
RedirectAttributes ra) {
// get some territory for user.
Long id = svc.getUserTerritory(principal.getName());
if (id != null) {
return new ModelAndView("redirect:/territories/" + id);
}
// return new view.
}
@RequestMapping("/territories/{id}")
public ModelAndView territory(@PathVariable("id") long id,
Principal principal,
ModelAndView mav,
Model m,
RedirectAttributes ra) {
// mav is empty, it does not contain flash attributes.
// m does contain flash attributes.
// Fill model and return view.
mav.setViewName("territory");
// fill the model...
return mav;
}
所有重定向都按预期工作,但模型属性会丢失。
我发现模型属性存在于Model
。
一种解决方案是重新添加Model
到RedirectAttribute
的所有Flash属性;这似乎是不必要的,实际上增加了比我想要的更多。
m.asMap().forEach((k, v) -> ra.addFlashAttribute(k, v));
恕我直言,处理程序不应该担心如何调用它(重定向,直接),所以不必重新添加flash属性。