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に入力して、エラーにかかるかやってみます。

うまく行ってますね。
このやり方を覚えると、入力チェックのバリエーションが増えます。
コントローラクラスに毎回書かないといけないのは、面倒です。
しかし。
標準の入力チェックアノテーションを、直感的に使えるので、個人的にはこっちのやり方をメインにした方が良いな・・とは思ってます。