2009-05-26 12 views
2

私は@RequestMapping(method = RequestMethod.GET)でアノテートされたメソッドを持つSpring 2.5アノテートコントローラを持っています。@ModelAttributeアノテートされたパラメータのデータバインディング

リクエストを実行する@RequestMapping(method = RequestMethod.POST)という注釈付きのメソッドもあります。このメソッドには、@ MyodelAttributeアノテーション付きのパラメータがあり、これには自分自身のフォームpojoが含まれています。MyFormという名前にします。 @ModelAttrributeで注釈を付けられたMyFormの初期化メソッドもあります。これまでのところ、すべてが期待通りに機能します:POSTリクエストでは、フォームデータはMyFormにバインドされ、処理できます。

問題は、(GET)リクエストパラメータを渡してフォームをあらかじめ入力できるようにすることです。私はMyFormの@ModelAttributeメソッドを持っているので、私のモデルではMyFormインスタンスを取得しますが、私のGETメソッドのパラメータとして特に使用しない限り、そのインスタンスは生成されません。

なぜ私はこれを行う必要がありますか?別の方法でGET要求のフォームにデータバインドを強制することは可能ですか?パラメータを渡すだけですが、すでにモデルに入っているので、何もする必要はありません。その結果、使用されていないメソッドパラメータが醜くなります。

[編集:説明するためのいくつかのコード例]

GETリクエストのフォーム移入ないコントローラ:私はhandlePageメソッドのメソッドシグネチャを変更すると

@Controller 
public class MyController { 

    @ModelAttribute("myForm") 
    public MyForm createForm() { 
    return new MyForm(); 
    } 

    @RequestMapping(method=RequestMethod.GET) 
    public void handlePage(Model model) { 
    //Do some stuff to populate the model.... 
    } 

    @RequestMapping(method=RequestMethod.POST) 
    public void processForm(@ModelAttribute("myForm") MyForm myForm) { 
    //Process the form 
    } 
} 

を、それがGETリクエストに読み込まれます... @ModelAttribute

@RequestMapping(method=RequestMethod.GET) 
public void handlePage(Model model, @ModelAttribute("myForm") MyForm myForm) { 
    //Do some stuff to populate the model.... 
} 
+0

あなたが自分のフォームpojoを持っていると言うとき、あなたはちょうどいくつかのドメインオブジェクトを意味していますよね? (いくつかのカスタムスプリングフォームの実装とは対照的に)。あなたのビューは単なる標準JSPですか? –

+0

うん、そうだよ。ちょうどいくつかのドメインオブジェクト。私の見解はJSPではありませんが、私はそれだけのことについての本を書くことができるので、ビューの実装の詳細(私自身ではありません)を惜しみません。 –

答えて

2

方法は@RequestMappingサポートしている任意の引数を持つことが許可されていますたとえば、コマンドオブジェクトやhttpリクエスト自体を移植するために、必要に応じて多くの@RequestParam引数を追加することができます。同じ方法でデータバインダーのインスタンスを取得できるかどうかはわかりません。再びドキュメントを読む

私は@RequestMappingメソッドの引数として@ModelAttributeを追加することなく、出来事を結合する任意のデータが存在しない理由はおそらくである、という考えは@ModelAttribute方法で事前人口は、データベースが駆動されるということだと思います。

+1

いいえ、データバインダーは@InitBinder注釈付きメソッド。私はそれも考えました...それはうまくいきませんでした。( モデル属性を渡して@SuppressWarnings( "unused")で注釈を付けることで、これを "修正"しました。 –