[MVC2] 5. 2-Bean Validationの検証


前の位置


スプリングの基本Validationについて知りました.
まず、Formタグに予期せぬ入力が発生する可能性があるため、サーバ側Validationが必要です.そこで、段階的にValidationを設計しました.
  • V 1-直接実施
    コントローラにHashMapを作成し、if文で確認してHashMapに追加します.しかし,タイプエラーを捉えられない限界もある.
  • V 2-BindingResultを使用
    BindingResultをパラメータに一緒に渡し、if文で例外が発生した場合はFieldErrorまたはObjectErrorを生成してBindingResultに追加します.タイプエラーが発生すると、スプリングは自動的にFieldErrorを追加します.タイムラインはBindingResultを使いやすくするので、ビュー出力も便利です.
  • V 3-メッセージの使用
    FiledErrorジェネレータにメッセージコード配列があります.これに基づいてbasename登録付きpropertiesメッセージを検索します.REECT Valueもあり、FieldErrorをより便利に使用できます.REECT ValueはエラーコードをBINDING Resultに入れ、メッセージコードからメッセージコードを生成し、FieldErrorのパラメータとしてBINDING Resultに入れる.
  • V 4-Validatorを取り外します
    コントローラの認証コードが入っていて、めちゃくちゃです.検証オブジェクトとBindingResultをパラメータとして、Validatorを継承するクラスを作成し、validateメソッドで検証ロジックをタップします.その後、WebDataBinderに検証が必要なコントローラを追加し、必要なハンドルパラメータに@Validatedを追加すると、スプリングが自動的に検証されます.もう1つの方法は、すべてのコントローラに適用できるようにグローバル設定することです.
  • 以上のように検証プロセスを行いました.次に、Validatorを継承するクラスを作成します.このクラスのvalidateメソッドでは、rejectとrequitValueを使用して検証ロジックを処理することが望ましい.もう少し便利にしてもらえませんか.
    よく考えてみるとnull検証、長さ検証などの検証処理内容はほぼ似ている.スプリングが提供するbean Validationを使用して、検証をより容易に実行しましょう.

    Bean Validationは

    public class Item {
    	@NotBlank
    	private String itemName;
        
        @NotNull
        @Range(min = 1000, max = 1000000)
        private Integer price;
    }
    上はbean Validationの例です.Nullチェック、長さチェックなどよく使われるチェックロジックを構文として応用するインタフェースはbean Validationである.インプリメンテーションでは、主に仮想Validatorが使用されます.
    implementation 'org.springframework.boot:spring-boot-start-validation'
    bean Validationを使用するにはbuildです.graldeに上記の依存関係を追加する必要があります.
    ライブラリを追加すると、スプリングガイドが自動的にbean Validatorをスプリングに結合します.LocalValidatorFactory beanがグローバルValidatorとして登録されます.このValidatorは、フィールドの@Notnullなどの構文を表示して検証します.グローバルValidatorを使用しているため、検証するパラメータに@Validateまたは@Validatedを追加するだけです.Validはjavaの@Validatedがspringの宣言であり、ベリファイアを実行することを意味します.検証エラーが発生した場合は、FieldErrorが自動的に生成され、BindingResultに格納されます.
    検証手順は次のとおりです.
    タイプを
  • パラメータの@ModelAttributeから各フィールドに変換してみます
  • が成功したとき、次いで
  • だった.
  • が失敗した場合、エラーコードをtypemismatchとして呼び出しを拒否します.FieldErrorが追加されました.
  • アプリケーション
  • Validator
  • すなわち、タイプエラーが発生した場合、検証を実行せずにタイプエラーをエラーコードに追加できます.検証は、オブジェクトが正しくバインドされているフィールドのみで実行されます.

    検証宣言



    これらはよく使われる方法です.

    エラーコード


    @NotBlank操作の説明が追加されたフィールドに空の文字列があり、例外が発生したとします.このとき自動的にREECT Valueを呼び出してFieldErrorを生成しますが、エラーコードはどのような値を使用しますか?
    BenValidationでは、エラーコードはネーミングスキームと同じです.これは、NotBlankをエラーコードとしてREECT Valueを呼び出し、これを「NotBlank」と呼ぶことを意味する.オブジェクト名.「フィールド名」、「NotBlank」.「フィールド名」、「NotBlank」.「タイプ名」「NotBlank」4つのメッセージコードがパラメータに渡され、FieldErrorが生成され、BindingResultが挿入される.したがって、propertiesでこれらのメッセージコードを設定することで、メッセージを指定できます.
    BenValidationでのメッセージの検索順序
    プロパティで
  • メッセージコードを検索する->NotBlank=「スペースの禁止」
  • のプレゼンテーションを使用したメッセージ属性->@NotBlank(メッセージ=「スペース禁止」)
  • ライブラリで指定されている既定値->空ではありません.
  • グローバルエラー処理

    if(item.getPrice() != null && item.getQuantity() != null) {
    	if(item.getPrice * item.getQuantity < 10000) {
        	bindingResult.reject("오류코드", 메시지 파라미터 Object 배열, 기본 메시지);
        }
    }
    「bean Validation」では、フィールドの空負荷を検証する方法と、フィールドエラーではなくオブジェクトエラー(グローバルエラー)を処理する方法を決定します.
    クラス名の上部に@ScriptAssert()構文を使用できますが、機能には制限があります.したがって、グローバルエラーの場合、コントローラはif文とrequest()で直接処理する必要があります.

    げんかい


    商品登録や商品修正にFormを使用します.同じItemクラスオブジェクトを使用してForm値を取得するとします.修正時に商品数量制限はありません...この2つの検証要件は異なる場合があります.bean Validationオブジェクトのフィールドに制約が設定されているため、この状況を柔軟に処理することはできません.この問題はBenValidationのGroupsという機能で解決できます.
  • を格納および変更するための空のインタフェース->SaveCheckを作成し、UpdateCheck
  • を定義します.
  • オブジェクトの検証宣言にグループを設定し、いつ保存および変更するか->@NotBlank(groups={SaveCheck.class,UpdateCheck.class}
  • )
  • @Validatedのインタフェース->@Validated(SavedCheck.class)
  • しかし、コードが乱れています.したがって、通常、Formごとにオブジェクトを再定義します.すなわち、EntityとなるItemと、修正のためのUpdateDtoと、登録のためのAddDtoとがそれぞれ宣言されている.Entityを個別に定義するのは、Formがすべてのフィールドを受け入れない可能性があるためです.

    Httpメッセージ変換器


    @Validおよび@Validatedは、@RequestBodyにも使用できます.ここで@RequestBodyについてお話ししましょう
    @RestController:ビューのコントローラではなくデータを直接転送します.オブジェクトを返すと、メッセージ変換器はJSONに変換されてクライアントに渡されます.
    @ModelAttribute:要求パラメータをオブジェクトに変換
    @RequestBody:Request Bodyのデータをオブジェクトに変換します.主にJSONリクエストをオブジェクトに変換します.
    メッセージ変換器は、JSON要求をオブジェクトに変換します.したがって、@RequestBodyのオブジェクトにJSONを入れ、Validationを実行します.@ModelAttribute検証とは異なり、@ModelAttribute検証では、タイプエラーが発生したときにtypeMismatchを使用してFieldErrorが自動的に生成され、残りのフィールドの検証が実行されます.@RequestBodyは、JSONをオブジェクト化する際に、タイプエラーが発生した場合に異常が発生してクローズします.そのため、これは後で異常処理により個別に処理する必要がある.