SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

入力チェック:@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

 うまく行ってますね。 

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

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

しかし。

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

 


 STS  +Spring Boot +thymeleaf 関連記事

 

入力画面に関連する記事

画像をSUBMITボタン代わりに使う

ラジオボタンとラジオボタングループを使う 

ラジオボタンとラジオボタングループを使う 

チェックボックスを使う。 

HTMLのタグの閉じ忘れで例外が発生する!

プルダウンリストとマルチセレクトボックスを使う。

今度はテキストエリアで複数行入力する。 

テキストボックスの入力と基本的なチェックを使う。

 

参照画面・画面遷移に関連する記事

参照画面:テーブルを使い、行毎に色分けした一覧表を表示する。 

参照画面:条件に一致した時のみHTML要素を出力する。

セッションを使って画面間で情報を受け渡す 

画面遷移:GET時のリクエストパラメータを受け取る 

日本語しか使わなくても、i18N対応はする意味がある。

 

入力チェックに関連する記事

入力チェック:未入力時に空文字が渡される仕様を回避する。 

入力チェック:@Patternと正規表現で独自チェックする。

入力チェック:アノテーション定義を自分で作る。(再利用版)

入力チェック用アノテーション定義を自分で作る。(独自実装版)

入力チェック:複数項目の相関チェックアノテーションの作り方

 

データアクセス・その他に関連する記事

データアクセス:Jprepositoryを使って簡単にCRUDする。 

データアクセス:ネイティブなSQL文を実行する 

クラスパス内の静的ファイルにアクセスする 

SpringBootだとログの書き出しも楽ちんです。 

SpringBootプロジェクトでJUNIT4を使った単体テストをする。