2011-09-12 39 views
5

私は、GETのデータを処理し、modelにいくつかのものを格納し、これらのオブジェクトを扱う別のページにリダイレクトするメソッドを持つコントローラを持っています。Spring MVC 3でコントローラのモデルからオブジェクトを取得するにはどうすればよいですか?

最初のメソッドに格納されたオブジェクトをモデルから取り出して、2番目のメソッドで使用する方法を見つけることができないようです。これどうやってするの?ここで

はコントローラのトップです:

@Controller 
@RequestMapping("/reviews") 
@SessionAttributes({"review", "externalReview"}) 
public class ReviewController { 
    // [SNIP] 
} 

ここで私がモデルにした後だオブジェクト追加するコードです:

現在
@RequestMapping(value="/new", params="UName", method=RequestMethod.GET) 
public String newFormFromExternal(@ModelAttribute("externalReview") ExternalReview externalReview, Model model) throws IncompleteExternalException { 
    // Convert the inbound external 
    Review fromExternal = ExternalReviewUtil.reviewFromExternalReview(externalReview, externalDAO); 

    // Add the externalReview to the session so we can look to see if we got a reviewee on the way in 
    model.addAttribute("externalReview", externalReview); 

    model.addAttribute("review", fromExternal); 

    return "redirect:/reviews/newFromExternal"; 
} 

答えて

2

あなたは幸運です。あなたが使用したり、新しくリリースされた春3.1に更新する機能を持っている場合は

、新しくスコープフラッシュ変数を利用することができます。

http://static.springsource.org/spring/docs/3.1.0.RC1/spring-framework-reference/html/mvc.html#mvc-flash-attributes

あなたが3.1を使用できない場合は、おそらく解決策を自分で実装することができます。基本的には、リダイレクトに必要なモデルオブジェクトをキャプチャしてセッションに挿入し、セッションが拡張されないように取得された後に削除する必要があります。

1

は、私だけのMapを取得しています私はそれがキー(Stringの名前)でそれをしたいオブジェクトを取得し、実際にオブジェクトにそれをキャスト(単にObjectではなく)。ここで

コードです:

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET) 
public String newExternalForm(Model model) { 
    // Get the review from the model 
    Review review = (Review) model.asMap().get("review"); 

    /*** Do stuff with the review from the model ****/ 

    return "reviews/newFromPacs"; 
} 

このように動作しますが、それはハックと不格好ようです。これは本当に唯一の方法ですか?あなたは(セキュリティのため)その属性のデータバインディングを無効にする必要がありますので、それは非常に醜いですけれども

+0

'review'は' @ SessionAttributes'で宣言されています。 – axtavt

+0

@axtavt - はい、質問を編集してコントローラクラスの定義を表示しました。 – cdeszaq

1

一つの可能​​な解決策は、@ModelAttributeを使用することです:

@RequestMapping(value="/newFromExternal", method=RequestMethod.GET) 
public String newExternalForm(@ModelAttribute Review review) { 
    ... 
} 

@InitBinder("review") 
public void disableReviewBinding(WebDataBinder b) { 
    b.setAllowedFields(); 
} 
+0

残念なことに、その属性のデータバインディングを無効にすると、ユーザーに不足しているデータを書き込ませる必要があります(2番目の方法で扱うもの)ので、後の 'POST'メソッドでバインドするのが現在のフローです。しかし、それは私が現在持っているものよりも(あるレベルで)クリーナーです。 – cdeszaq

関連する問題