ひよっこ。

I want to…

Spring3の@MVCの@InitBinderの挙動に関して

Posted by hikaruworld : 2011 2月 9

Springの@Controllerにはクライアントから渡された値を任意の型に変換する、
@InitBinderというアノテーションがあります。
Spring1.Xから知っている人にはおなじみのInitBinderそのものです。

簡単にいうと、クライアント側で

2/12

という値を設定してデータが送られた場合、Date型に変換したり、
サーバからクライアントに値を送る際にDate型をDateFormatで
任意の表示形式に変換したりできます。

今回やりたかったのは、このInitBinderの値を特定のフィールド、ないしはパラメータにのみ適用する方法です。
@InitBinderには引数に値を設定出来、おそらくこの値を設定すれば良いのは分かるのですが、
この英語の説明がパッと分からなかったので、ソースを読んでいました。

実際に実行処理が行われているのは、HandlerMethodInvoker.initBinderの部分で以下のようになっています。

String[] targetNames = AnnotationUtils.findAnnotation(initBinderMethod, InitBinder.class).value();
if (targetNames.length == 0 || Arrays.asList(targetNames).contains(attrName)) {
	//ここで実処理
	...

気になるのはattrNameとtargetNamesの部分。
targetNamesはInitBinderのアノテーションで指定可能なvalue値の部分で、
何も設定していない場合は、そのまま全部のデータに対して処理が行われるようです(targetNames.length == 0)。

じゃあattrNameに何が渡されるかというのが今回の興味。

POJOを@RequestMappingの情報に渡した場合は、そのオブジェクトの値が渡されます。
つまり、以下のような設定をしていた場合、

@RequestMapping(value = "/", method = RequestMethod.GET)
public String hogehoge(Piyo piyo) {
  //...
}

attrNameにはpiyoが渡されます。
この変換ロジックはSpringのドキュメントのどこかに書いてあった気がしますが、
忘れたので割愛。

次に、@PathVariableを設定した場合はその変数名が渡されます。
こういうケースですね。この例ではabcが渡されます。

@RequestMapping(value="/{abc}", method=RequestMethod.GET)
public String home(@PathVariable("abc") int def) {
  //...
}

次に@RequestParamを利用したケースです。

@RequestMapping(value="/ab", method=RequestMethod.GET)
public String home2(@RequestParam int id) {
  logger.info("Welcome home!");
  return "home";
}

はい、言わずともがな、attrNameにはidが渡されます。

眠くなってきたのでこの辺で。

ちなみに、同名の名前があった場合はどちらにもInitBinderが適用されるようです。
これは規約ベースの書き方で素敵ですね。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。