1

アプリをSpring2.0.7から3.1.1に移行していますが、initBinderで問題が発生しました。以前は次のようなメソッドがありました

protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
    MyCommand command = (MyCommand)binder.getTarget();
    binder.registerCustomEditor(CustomerCard.class, createEditorFromCommand(command));
}

ここで、ターゲットはPropertyEditorによって使用されます。このメソッドは、アノテーション付きのコントローラーにしたときに呼び出されなくなったため、@InitBinderアノテーションを追加しました。

@InitBinder
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
    MyCommand command = (MyCommand)binder.getTarget();
    binder.registerCustomEditor(CustomerCard.class, createEditorFromCommand(command));
}

残念ながら、これbinder.getTarget()は単なるデフォルトオブジェクトです。@InitBinderのドキュメントには、コマンドをパラメーターとして取得できないことも記載されています。

このようなinit-binderメソッドは、コマンド/フォームオブジェクトと対応する検証結果オブジェクトを除いて、{@linkRequestMapping}がサポートするすべての引数をサポートします。

これを行う正しい方法は何ですか?

4

3 に答える 3

0

おそらくパーティーには少し遅れていますが、それでも - @InitBinder メソッドでモデル (コマンド) オブジェクトを参照する方法を次に示します。

@InitBinder("commandName")
public void initBinder(WebDataBinder binder) throws Exception {
   CommandClass command = (CommandClass) binder.getTarget();
   binder.registerCustomEditor(Some.class, new SomeEditor(command.getOptions());
}

@ModelAttribute("commandName")
public OrderItem createCommand(HttpServletRequest request) {
   return new CommandClass();
}

@InitBinder の代わりに @InitBinder("something") を配置することをお勧めします。このように @InitBinder は複数回呼び出されるのではなく、構成されたオブジェクトが検出されたときにのみ呼び出されます。

于 2014-05-21T23:17:40.900 に答える
0
@InitBinder
protected void initBinder(WebDataBinder binder) {
  MyCommand command = (MyCommand)binder.getTarget();
  binder.registerCustomEditor(CustomerCard.class, createEditorFromCommand(command));
}
于 2012-05-15T16:29:32.363 に答える
0
@RequestMapping
// binder will return MyCommand on getTarget()
public void handleMyCommand(MyCommand c) {  
 ...
}

// initialize command before handleMyCommand method call
@ModelAttribute
public MyCommand initializeMyCommand() {
   // perform initialization.
}

@InitBinder
protected void initBinder(WebDataBinder binder) {
   MyCommand c  = (MyCommand) binder.getTarget();
   binder.registerCustomEditor(CustomerCard.class, createEditorFromCommand(c));
}

createEditorFromCommand(new MyCommand())しかし、コマンドはユニット化されているので ¿

于 2012-05-15T23:19:27.607 に答える