2011-09-13 7 views
4

Spring MVCのアプリケーション用のコントローラをするとき、私は
私は春のフォームから新しいクラスインスタンスを渡したいたびに新しいメソッドを指定する必要があります。
春のフォームコントローラの一般化

@RequestMapping(method=RequestMethod.POST) 
public String mainPost(@Valid MyClass myClass, 
     BindingResult result, Model model) { 
    // do the same stuff each time here 
} 

は、だから私は書く必要があります私のアプリケーションで可能なすべてのMyClassのメソッド
はコントローラに渡すことができますが、これらのメソッドはすべて全く同じものです
(彼らはエラーをチェックし、このオブジェクトをサービスレイヤに渡します)。

どのようにしてこのすべてのメソッドを1つにマージできますか?

私は(それが動作しません)、次のようないくつかの解決策があることを信じている:

@RequestMapping(method=RequestMethod.POST) 
public <T> String mainPost(@Valid T myObject, 
     BindingResult result, Model model) { 
    // check errors and pass the object myObject to a service layer 
} 

答えて

3

あなたは、一般的なコントローラメソッドを持つことはできませんが、一般的なコントローラを作成することができます

public abstract class AbstractController<T> { 
    @RequestMapping(method=RequestMethod.POST) 
    public String mainPost(@Valid T myObject, 
      BindingResult result, Model model) { ... } 
} 

@Controller 
@RequestMapping("/myclass") 
public class MyClassController extends AbstractController<MyClass> { ... } 
+0

はいはるかに簡単ですが、モデルに新しいクラスを追加するときにコントローラコードを追加しないようにするコントローラを作成する方法があることを願っています。このようなAbstractControllerを使うと、新しいクラスをモデルに追加するときに新しいコントローラクラスを追加する必要があります。 – tsds

+0

@tsds:ジェネリックメソッドが異なるモデルクラスに同じURLマッピングを使用する場合、どのクラスをバインドする必要があるのですか? – axtavt

+0

すべてのスプリングフォームにはcommandNameパラメータがあります。したがって、データスプリングがこのクラスのインスタンス(このパラメータで指定されたもの)を構築するとき、この情報はコントローラにとっては十分だと思いますが、私はそれほど自信がありません。 – tsds