Spring MVCでは、テキストボックスを未入力な状態で、Submitした時に、空文字(””)をセットする仕様になっています。
なので、@NotNullアノテーションでは、未入力の時にエラーになってくれません。
今回はこれを回避する方法あれこれです。
なお、STS3(3.9.6)+SpringBoot2.0+tymeleaf3.0迄動作確認しています。
とりあえずの回避法
@NotNull以外に@Size(min=1)をつけて、必須入力っぽくやる方法があります。
でも、このパターンで対応できない場合があります。
パターンで対応できない場合 は?
例えば、任意入力でかつサイズ制限をつけたい時です。
ありますよね。
任意入力だから未入力のときはスルーしたいけれど、入力があれば、@Size(min=6,Max=20)みたいに、6文字より少ない場合はエラーにしたいようなケースは。
ところが、未入力で空文字("")が返ってしまうと、この文字数が少ない場合のエラーにひっかかってしまって、未入力のときにスルーするのが実現できません。
やっぱり、未入力の場合は空文字(””)でなく、NULLを返すのが必要な場合があるわけです。
未入力の場合にNULLを返す方法
方法自体は簡単です。
コントローラクラスに以下のメソッドを追加するだけです。
@InitBinder
public void initbinder(WebDataBinder binder){
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}
こうすると、 registerCustomEditorが入力データをトリム(余分な空白を削除)して、未入力の場合はNULLに変換してFormに渡してくれます。
コントローラクラスに、このメソッドを仕込むと、Formクラスの必須入力は@NotNullアノテーションだけでOKになります。
@NotNull
private String inputPid;
public String getInputPid() {
return inputPid;
}public void setInputPid(String inputPid) {
this.inputPid = inputPid;
}
こんな感じです。
これができれば、任意入力のサイズチェックも可能です。
さっきのPID入力チェックを以下のように書き直します。
@Size(min=6,max=20)
private String inputPid;
ちなみに。
今回の対応をしていない場合は、@Sizeの指定だけで、なんとなく必須入力チェック+桁数チェックもできていました。
空文字がmin=6の部分でひっかかってくれましたからね。
でも、Nullが戻るようになると、それができなくなります。
必須チェックが必要な場合は、以下のように、@NotNullアノテーションをつける必要がありますので、注意してください。
@NotNull
@Size(min = 6,max=20)
private String inputPwd;
実行します
まず、両方共未入力でやってみます。
PIDの未入力がスルーされて、パスワードで必須入力にひっかかっているのがわかります。
今度は、4文字だけPIDに入力して、エラーにかかるかやってみます。
うまく行ってますね。
このやり方を覚えると、入力チェックのバリエーションが増えます。
コントローラクラスに毎回書かないといけないのは、面倒です。
しかし。
標準の入力チェックアノテーションを、直感的に使えるので、個人的にはこっちのやり方をメインにした方が良いな・・とは思ってます。
STS +Spring Boot +thymeleaf 関連記事
入力画面に関連する記事
参照画面・画面遷移に関連する記事
参照画面:テーブルを使い、行毎に色分けした一覧表を表示する。
入力チェックに関連する記事
入力チェック:@Patternと正規表現で独自チェックする。
入力チェック用アノテーション定義を自分で作る。(独自実装版)
データアクセス・その他に関連する記事