如何在多个重定向上保留模型闪存属性

时间:2017-02-14 07:36:14

标签: java spring spring-mvc

假设我有一个用于查看客户的控制器方法,如果他们无权查看该客户,则将错误消息添加为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

一种解决方案是重新添加ModelRedirectAttribute的所有Flash属性;这似乎是不必要的,实际上增加了比我想要的更多。

m.asMap().forEach((k, v) -> ra.addFlashAttribute(k, v));

恕我直言,处理程序不应该担心如何调用它(重定向,直接),所以不必重新添加flash属性。

1 个答案:

答案 0 :(得分:0)

您可以在控制器级别使用@SessionAttributes

here for more details