Chapter 39

validationクラス

kazpgm
kazpgm
2022.01.13に更新

validationクラスを説明する。

当クラスは全て固定です。「javaSpringBootテーブル項目一覧などの定義」エクセルに影響されません。

Emailチェック(CheckEmail.java)

validation.CheckEmail.java
・独自、制約アノテーション(Constraint Annotation) を作成しています。

package com.kaz01u.demo.validation;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import javax.validation.constraints.Pattern;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
 * Emailチェック
 *
 */

・javadoc コマンドなどで作成したドキュメントに反映させる為の設定。

@Documented

・バリデーションを行うクラスを指定するが、今回は空(チェックは@Patternを使う)。

@Constraint(validatedBy = {})

・アノテーションの付与対象をクラスを、METHOD(メソッドの宣言)、FIELD(フィールドの宣言)、ANNOTATION_TYPE(アノテーション型の宣言)、CONSTRUCTOR(コンストラクタの宣言)、PARAMETER(メソッドのパラメータの宣言)とする。

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })

・RetentionPolicyはclassファイルに記録され実行時に参照できるモード(Runtime)とする。よって、CheckEmailアノテーションチェック処理を1クラスで複数回実施できるようになる。

@Retention(RUNTIME)

・@ReportAsSingleViolationを利用するとデフォルトメッセージ(今回は、String message() default "{CheckEmail}";)が機能します。例えば、このCheckEmailにはないが、@Size(min = 5, max = 50)とかも書いといて、@Patternのチェックと同時にチェックするとしたとき、@Sizeのエラーは出さずに、デフォルトメッセージのみ出すために@ReportAsSingleViolationを使っています。

@ReportAsSingleViolation

・このアノテーションのルールを@Patternに定義する。これは、Emailの条件です。
・以降の全角チェック(CheckFull.java)~電話番号チェック(CheckTel.java)はこの@Patternの違いでチェックしている。ので、当書では@Patternのみ記述します。

@Pattern(regexp = "^(([a-zA-Z0-9])+([a-zA-Z0-9\\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\\._-]+)+)*$")

・CheckEmailアノテーションになる。

public @interface CheckEmail {

・制約アノテーション(Constraint Annotation) には、決まったひな形(message(), groups(), payload() )の設定が必須です。
・エラー時に例外オブジェクトに設定されるメッセージ。"{CheckEmail}"はmessages.propertiesのCheckEmailになる。

    String message() default "{CheckEmail}";

・特定のバリデーショングループをカスタマイズ可能にする設定(※空の Class<?> 型で初期化)。

    Class<?>[] groups() default {};

・チェック対象のオブジェクトにメタ情報を与える為の宣言。

    Class<? extends Payload>[] payload() default {};

・ここからは、アノテーション内部に定義されたアノテーション。外側に定義したアノテーション(CheckEmailアノテーション)の配列を返すように宣言する。

    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    public @interface List {
        CheckEmail[] value();
    }
}

全角チェック(CheckFull.java)

validation.CheckFull.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp =  "^[^ -~。-゚]*$")

全角ひらがなチェック(CheckFullHira.java)

validation.CheckFullHira.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[あ-んー ]*$")

全角カタカナチェック(CheckFullKana.java)

validation.CheckFullKana.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[ァ-ヶー ]*$")

先頭、末尾に全角空白を使用しないチェック(CheckFullStartEndSpace.java)

validation.CheckFullStartEndSpace.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[^( )].*[^( )]$|^[^( )]$|^$")

半角チェック(CheckHalf.java)

validation.CheckHalf.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[\\x00-\\x7F]*$")

半角数字チェック(CheckHalfDigit.java)

validation.CheckHalfDigit.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[0-9]*$")

半角カタカナチェック(CheckHalfKana.java)

validation.CheckHalfKana.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[ヲ-゚ ]*$")

半角カタカナ数字チェック(CheckHalfKanaDigit.java)

validation.CheckHalfKanaDigit.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[ヲ-゚0-9 ]*$")

半角英字チェック(CheckHalfLetter.java)

validation.CheckHalfLetter.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[a-zA-Z ]*$")

半角英字大文字のみチェック(CheckHalfLetterBig.java)

validation.CheckHalfLetterBig.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[A-Z ]*$")

半角英数字チェック(CheckHalfLetterDigit.java)

validation.CheckHalfLetterDigit.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[a-zA-Z0-9 ]*$")

半角英数字大文字のみチェック(CheckHalfLetterDigitBig.java)

validation.CheckHalfLetterDigitBig.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[A-Z0-9 ]*$")

半角英数字記号チェック(CheckHalfLetterDigitKigou.java)

validation.CheckHalfLetterDigitKigou.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[a-zA-Z0-9!-/:-@\\[-`{-~ ]*$")

半角英数字小文字のみチェック(CheckHalfLetterDigitSmall.java)

validation.CheckHalfLetterDigitSmall.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[a-z0-9 ]*$")

半角英字小文字チェック(CheckHalfLetterSmall.java)

validation.CheckHalfLetterSmall.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[a-zA-Z0-9 ]*$")

ディレクトリ不使用文字チェック(CheckHalfNotDirMoji.java)

validation.CheckHalfNotDirMoji.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[^/:*?\"\\<>|~\\x5C]*$")

先頭、末尾に半角空白を使用しないチェック(CheckHalfStartEndSpace.java)

validation.CheckHalfStartEndSpace.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[^ ].*[^ ]$|^[^ ]$|^$")

郵便番号チェック(CheckPost.java)

validation.CheckPost.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[0-9]{3}-[0-9]{4}$|^$")

ソート順チェック(CheckSortOrder.java)

validation.CheckSortOrder.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[AD]{1}$|^$")

電話番号チェック(CheckTel.java)

validation.CheckTel.java
考え方はEmailチェック(CheckEmail.java)と同じなので、当書では@Patternのみ記述します。

@Pattern(regexp = "^[0-9]{2,4}-[0-9]{2,4}-[0-9]{4}$|^$")

チェックグループ(GroupOrder)(GroupOrder)

validation.GroupOrder.java
・UserController.javaで「public String userInsDo(@Validated(GroupOrder.class) UserForm userForm,・・・」のように使用しています。
・@Validated(GroupOrder.class) は@Validated({GroupOrder1.class, GroupOrder2.class, GroupOrder3.class}) と同じ意味です。

package com.kaz01u.demo.validation;
import javax.validation.GroupSequence;
/**
 * チェックグループ(GroupOrder)
 *
 */
@GroupSequence({GroupOrder1.class, GroupOrder2.class, GroupOrder3.class})
public interface GroupOrder {
}

チェックグループ(GroupOrder1)(GroupOrder1)

validation.GroupOrder1.java
・ShohinController.javaで「ublic String shohinInsDo(@Validated({GroupOrder1.class, GroupOrder2.class}) ShohinForm shohinForm,・・・」のように使用しています。

package com.kaz01u.demo.validation;
/**
 * チェックグループ(GroupOrder1)
 *
 */
public interface GroupOrder1 {
}

チェックグループ(GroupOrder2)(GroupOrder2)

validation.GroupOrder2.java
・ShohinController.javaで「ublic String shohinInsDo(@Validated({GroupOrder1.class, GroupOrder2.class}) ShohinForm shohinForm,・・・」のように使用しています。

package com.kaz01u.demo.validation;
/**
 * チェックグループ(GroupOrder2)
 *
 */
public interface GroupOrder2 {
}

チェックグループ(GroupOrder3)(GroupOrder3)

validation.GroupOrder3.java
・UserForm.javaで「@AssertTrue(message="『パスワード確認』は『パスワード』と同じ値を入力してください", groups={GroupOrder3.class})」のように使用しています。

package com.kaz01u.demo.validation;
/**
 * チェックグループ(GroupOrder3)
 *
 */
public interface GroupOrder3 {
}