41

我想知道如何在 Spring MVC 3.1 中重定向后读取 flash 属性。

我有以下代码:

@Controller
@RequestMapping("/foo")
public class FooController {

  @RequestMapping(value = "/bar", method = RequestMethod.GET)
  public ModelAndView handleGet(...) {
    // I want to see my flash attributes here!
  }

  @RequestMapping(value = "/bar", method = RequestMethod.POST)
  public ModelAndView handlePost(RedirectAttributes redirectAttrs) {
    redirectAttrs.addFlashAttributes("some", "thing");
    return new ModelAndView().setViewName("redirect:/foo/bar");
  }

}

我错过了什么?

4

3 回答 3

54

使用Model,它应该预先填充了 flash 属性:

@RequestMapping(value = "/bar", method = RequestMethod.GET)
public ModelAndView handleGet(Model model) {
  String some = (String) model.asMap().get("some");
  // do the job
}

或者,您可以使用RequestContextUtils#getInputFlashMap

@RequestMapping(value = "/bar", method = RequestMethod.GET)
public ModelAndView handleGet(HttpServletRequest request) {
  Map<String, ?> inputFlashMap = RequestContextUtils.getInputFlashMap(request);
  if (inputFlashMap != null) {
    String some = (String) inputFlashMap.get("some");
    // do the job
  }
}

PS 你可以return new ModelAndView("redirect:/foo/bar");handlePost.

编辑

JavaDoc 说:

调用方法时,RedirectAttributes 模型为空,并且永远不会使用,除非该方法返回重定向视图名称或 RedirectView。

它没有提到ModelAndView,所以也许改变 handlePost 以返回"redirect:/foo/bar"字符串或RedirectView

@RequestMapping(value = "/bar", method = RequestMethod.POST)
public RedirectView handlePost(RedirectAttributes redirectAttrs) {
  redirectAttrs.addFlashAttributes("some", "thing");
  return new RedirectView("/foo/bar", true);
}

RedirectAttributes在我的代码中使用RedirectViewandmodel.asMap()方法,它工作正常。

于 2012-08-01T16:43:42.517 回答
32

试试这个:

@Controller
public class FooController
{
    @RequestMapping(value = "/foo")
    public String handleFoo(RedirectAttributes redirectAttrs)
    {
        redirectAttrs.addFlashAttribute("some", "thing");
        return "redirect:/bar";
    }

    @RequestMapping(value = "/bar")
    public void handleBar(@ModelAttribute("some") String some)
    {
        System.out.println("some=" + some);
    }
}

适用于 Spring MVC 3.2.2

于 2013-08-01T19:50:13.360 回答
0

对于所有像我这样在验证失败时在浏览器中查看 POST url 时遇到问题的人。

POST url 是一个私有 url,不应向用户公开,但在验证失败时会自动呈现。即,如果一个字段低于最小长度。我正在使用@Valid。我希望表单的原始 GET url 始终显示,即使验证反弹回表单,所以我做了以下操作:

        if (validation.hasErrors()) {

        redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.story", validation);
        redirectAttributes.addFlashAttribute("story", story);
        return new ModelAndView("redirect:/january/2015");

其中 story 是表单对象表示,redirectAttributes 是您放入方法签名中的 RedirectAttributes,validation 是 BindingResult。/january/2015 是表单所在的 GET 控制器的映射。

在此实施之后,在 /january/2015 的映射中,story 完好无损,如下所示:

Story story= (Story) model.asMap().get("story");
//story from the POST method

我不得不增加我的 GET 方法并检查这是否不为空。如果不为空,则将其发送到表单,否则我会将新初始化的 Story 类型作为之前的默认行为发送到表单。

以这种方式,我能够返回到具有完整绑定结果的表单(错误显示在表单上),但我的 GET url 代替了 post url。

于 2015-06-24T04:20:01.367 回答