【问题标题】:How to read flash attributes after redirection in Spring MVC 3.1?如何在 Spring MVC 3.1 中重定向后读取 flash 属性?
【发布时间】:2012-07-30 14:48:01
【问题描述】:

我想知道在 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");
  }

}

我错过了什么?

【问题讨论】:

    标签: java spring-mvc


    【解决方案1】:

    使用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
      }
    }
    

    附:您可以在handlePost 中返回return new ModelAndView("redirect:/foo/bar");

    编辑

    JavaDoc 说:

    当方法被调用时,RedirectAttributes 模型是空的并且是 除非该方法返回重定向视图名称或 重定向视图。

    它没有提到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);
    }
    

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

    【讨论】:

    • 谢谢,我试试看。
    • 不走运,我的模型要空了。
    • 你试过RequestContextUtils.getInputFlashMap(request)吗?
    • 我会尝试返回RedirectView,然后返回String
    • 谢谢,返回RedirectView 就像一个魅力。
    【解决方案2】:

    试试这个:

    @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

    【讨论】:

    • 请注意,您无法检查自定义对象上的“属性是否已填充”。即使重定向属性中没有具有给定名称的对象,@ModelAttribute 也会返回 not-null。
    【解决方案3】:

    对于所有像我这样在验证失败时无法在浏览器中看到 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) model.asMap().get("story");
    //story from the POST method
    

    我必须扩充我的 GET 方法并检查它是否不为空。如果不为 null,则将其发送到表单,否则我会将新初始化的 Story 类型作为之前的默认行为发送到表单。

    通过这种方式,我可以在绑定结果完好无损的情况下返回表单(错误显示在表单上),但我的 GET url 代替了 post url。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 2017-10-12
      相关资源
      最近更新 更多