業務で、『String型のformが未入力でsubmitされたとき空文字ではなくNullで受け取りたい』というケースが発生して、調べたらすぐ解決できたのでメモしておきます!
結論からいうと、リクエストパラメータを受け取って処理をするControllerクラス(@Controller)に、@InitBinderを指定するという対応です。
どういうことか、これから具体的に見ていきます。
実現したい内容(食べログを例に)
「エリア・駅」という項目、「キーワード」という項目は、入力必須項目ではないため、何も入力せずに検索ボタンが押されることは容易に想定できます。
ここで仮に、上記2項目が文字列を入力できるString型の項目ということにしましょう。(あくまで例なので注意です)
何も入力されずに検索ボタンが押されたとき、Springのデフォルトだとnullではなく空文字(””)がプログラム側に渡されてきます。
僕はそれをどうにか空文字ではなく、nullで受け取れるようにしたかったんですね。
どうすればnullで受け取れるようになるか
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}
プログラム例のように、@InitBinderアノテーションをつけたメソッドをハンドラクラス(@Controllerクラス)に用意することで、フォームクラスやメソッド引数に対してリクエストバインディング処理を行う前に、このメソッドが呼び出されるようになります。
引数にはWebDataBinderを設定してください!
WebDataBinderとは・・・
Web リクエストパラメーターから JavaBean オブジェクトへのデータバインディング用の特別な DataBinder
また、new StringTrimmerEditor(true) とすることで、空の文字列を null に変換することができます。
あと、@InitBinderのあとにクラス名を指定すると指定したクラスにだけ適用できるようです。
ここではtabelogFormDtoというクラスを指定していますが、この場合はString型であるareaとkeywordがnullで受け取れるということですね。
@InitBinder("tabelogFormDto")
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}
public class tabelogFormDto {
/** エリア・駅. */
private String area;
/** キーワード */
private String keyword;
/** 日付. */
private Date date;
}
@InitBinderは他にどういう場合に使えるか
パッと思いつくところでいうと、型変換したり、Springにデフォルトで用意されていないような入力値のバリデーション(検査)をしたいというときはとても有効だと思います!