BOKUのブログ

ジャンルにこだわらず、ノートの感じで書いてます

入力チェック:@NotNullで未入力時に正しくNULLを返すようにする。STS 3+Spring Boot +thymeleaf 

Spring MVCでは、テキストボックスを未入力な状態で、Submitした時に、空文字(””)をセットする仕様になっています。 

なので、@NotNullアノテーションでは、未入力の時にエラーになってくれません。

今回はこれを回避する方法あれこれです。

なお、STS3(3.9.6)+SpringBoot2.0+tymeleaf3.0迄動作確認しています。

f:id:arakan_no_boku:20190222012501j:plain

 

とりあえずの回避法

 

@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;
}

こんな感じです。 

f:id:arakan_no_boku:20170323225433j:plain

これができれば、任意入力のサイズチェックも可能です。

さっきのPID入力チェックを以下のように書き直します。

@Size(min=6,max=20)
private String inputPid;

 

ちなみに。

今回の対応をしていない場合は、@Sizeの指定だけで、なんとなく必須入力チェック+桁数チェックもできていました。 

空文字がmin=6の部分でひっかかってくれましたからね。 

でも、Nullが戻るようになると、それができなくなります。 

必須チェックが必要な場合は、以下のように、@NotNullアノテーションをつける必要がありますので、注意してください。

@NotNull
@Size(min = 6,max=20)
private String inputPwd;

 

実行します

 

まず、両方共未入力でやってみます。

f:id:arakan_no_boku:20170323232908j:plain

PIDの未入力がスルーされて、パスワードで必須入力にひっかかっているのがわかります。 

今度は、4文字だけPIDに入力して、エラーにかかるかやってみます。

f:id:arakan_no_boku:20170323233102j:plain

 うまく行ってますね。 

このやり方を覚えると、入力チェックのバリエーションが増えます。 

コントローラクラスに毎回書かないといけないのは、面倒です。

しかし。

標準の入力チェックアノテーションを、直感的に使えるので、個人的にはこっちのやり方をメインにした方が良いな・・とは思ってます。