[MVC2] 5. 2-Bean Validationの検証
前の位置
スプリングの基本Validationについて知りました.
まず、Formタグに予期せぬ入力が発生する可能性があるため、サーバ側Validationが必要です.そこで、段階的にValidationを設計しました.
コントローラにHashMapを作成し、if文で確認してHashMapに追加します.しかし,タイプエラーを捉えられない限界もある.
BindingResultをパラメータに一緒に渡し、if文で例外が発生した場合はFieldErrorまたはObjectErrorを生成してBindingResultに追加します.タイプエラーが発生すると、スプリングは自動的にFieldErrorを追加します.タイムラインはBindingResultを使いやすくするので、ビュー出力も便利です.
FiledErrorジェネレータにメッセージコード配列があります.これに基づいてbasename登録付きpropertiesメッセージを検索します.REECT Valueもあり、FieldErrorをより便利に使用できます.REECT ValueはエラーコードをBINDING Resultに入れ、メッセージコードからメッセージコードを生成し、FieldErrorのパラメータとしてBINDING Resultに入れる.
コントローラの認証コードが入っていて、めちゃくちゃです.検証オブジェクトとBindingResultをパラメータとして、Validatorを継承するクラスを作成し、validateメソッドで検証ロジックをタップします.その後、WebDataBinderに検証が必要なコントローラを追加し、必要なハンドルパラメータに@Validatedを追加すると、スプリングが自動的に検証されます.もう1つの方法は、すべてのコントローラに適用できるようにグローバル設定することです.
よく考えてみると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に格納されます.
検証手順は次のとおりです.
タイプを
検証宣言
これらはよく使われる方法です.
エラーコード
@NotBlank操作の説明が追加されたフィールドに空の文字列があり、例外が発生したとします.このとき自動的にREECT Valueを呼び出してFieldErrorを生成しますが、エラーコードはどのような値を使用しますか?
BenValidationでは、エラーコードはネーミングスキームと同じです.これは、NotBlankをエラーコードとしてREECT Valueを呼び出し、これを「NotBlank」と呼ぶことを意味する.オブジェクト名.「フィールド名」、「NotBlank」.「フィールド名」、「NotBlank」.「タイプ名」「NotBlank」4つのメッセージコードがパラメータに渡され、FieldErrorが生成され、BindingResultが挿入される.したがって、propertiesでこれらのメッセージコードを設定することで、メッセージを指定できます.
BenValidationでのメッセージの検索順序
プロパティで
グローバルエラー処理
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という機能で解決できます.
各
Httpメッセージ変換器
@Validおよび@Validatedは、@RequestBodyにも使用できます.ここで@RequestBodyについてお話ししましょう
@RestController:ビューのコントローラではなくデータを直接転送します.オブジェクトを返すと、メッセージ変換器はJSONに変換されてクライアントに渡されます.
@ModelAttribute:要求パラメータをオブジェクトに変換
@RequestBody:Request Bodyのデータをオブジェクトに変換します.主にJSONリクエストをオブジェクトに変換します.
メッセージ変換器は、JSON要求をオブジェクトに変換します.したがって、@RequestBodyのオブジェクトにJSONを入れ、Validationを実行します.@ModelAttribute検証とは異なり、@ModelAttribute検証では、タイプエラーが発生したときにtypeMismatchを使用してFieldErrorが自動的に生成され、残りのフィールドの検証が実行されます.@RequestBodyは、JSONをオブジェクト化する際に、タイプエラーが発生した場合に異常が発生してクローズします.そのため、これは後で異常処理により個別に処理する必要がある.
Reference
この問題について([MVC2] 5. 2-Bean Validationの検証), 我々は、より多くの情報をここで見つけました https://velog.io/@kiwonkim/MVC2-5.-검증2-Bean-Validationテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol