0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

@initBinderでString型のリクエストパラメータを空文字からNullにしました

Last updated at Posted at 2022-01-27

業務で、『String型のformが未入力でsubmitされたとき空文字ではなくNullで受け取りたい』というケースが発生して、調べたらすぐ解決できたのでメモしておきます!

結論からいうと、リクエストパラメータを受け取って処理をするControllerクラス(@Controller)に、@InitBinderを指定するという対応です。

どういうことか、これから具体的に見ていきます。

実現したい内容(食べログを例に)

image.png

「エリア・駅」という項目、「キーワード」という項目は、入力必須項目ではないため、何も入力せずに検索ボタンが押されることは容易に想定できます。

ここで仮に、上記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にデフォルトで用意されていないような入力値のバリデーション(検査)をしたいというときはとても有効だと思います!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?