41

Spring MVC 3.1 でリダイレクト後にフラッシュ属性を読み取る方法を知りたいです。

次のコードがあります。

@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します。フラッシュ属性が事前に入力されている必要があります。

@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 に答える
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) model.asMap().get("story");
//story from the POST method

GET メソッドを拡張して、これが null でないかどうかを確認する必要がありました。null でない場合は、これをフォームに送信します。それ以外の場合は、新しく初期化された Story タイプをデフォルトの動作としてフォームに送信します。

このようにして、バインディング結果がそのままの状態でフォームに戻ることができますが (フォームにエラーが表示されます)、投稿 URL の代わりに GET URL が表示されます。

于 2015-06-24T04:20:01.367 に答える