記事ディレクトリ
1.異常検証の仕様と一般的な注釈
Web開発では、リクエストパラメータについては、通常、パラメータの妥当性を検証する必要があります。本来の記述方法は、各フィールドを1つずつ判断することです。この方法はあまり一般的ではないため、JavaのJSR 303:BeanValidation仕様はこの問題を解決します。
JSR 303は単なる仕様であり、特定の実装はありません。現在、統一されたパラメーター検証には通常、hibernate-validatorのみが使用されます。
JSR303で定義されている検証タイプ(「3.4。構成ファイルインジェクション値データの検証」を参照)
制約 | 詳細 |
---|---|
@ヌル | 注釈付き要素はnullである必要があります |
@NotNull | 注釈付き要素はnullであってはなりません |
@AssertTrue | 注釈付き要素は真でなければなりません |
@AssertFalse | 注釈付き要素はfalseである必要があります |
@Min(値) | 注釈付き要素は、値が指定された最小値以上である必要がある数値である必要があります |
@Max(値) | 注釈付き要素は、値が指定された最大値以下である必要がある数値である必要があります |
@DecimalMin(value) | 注釈付き要素は、値が指定された最小値以上である必要がある数値である必要があります |
@DecimalMax(value) | 注釈付き要素は、値が指定された最大値以下である必要がある数値である必要があります |
@Size(max、min) | 注釈付き要素のサイズは、指定された範囲内である必要があります |
@Digits(整数、分数) | 注釈付き要素は数値である必要があり、その値は許容範囲内である必要があります |
@過去 | 注釈付き要素は過去の日付である必要があります |
@未来 | 注釈付き要素は将来の日付である必要があります |
@Pattern(value) | 注釈付き要素は、指定された正規表現と一致する必要があります |
HibernateValidatorの追加の制約 | |
制約 | 詳細 |
-------------- | -------------- |
@Eメール | 注釈付きの要素はメールアドレスである必要があります |
@長さ | 注釈付き文字列のサイズは、指定された範囲内である必要があります |
@空ではない | 注釈付きの文字列は空でない必要があります |
@範囲 | 注釈付き要素は適切なスコープ内にある必要があります |
使用法:上記のアノテーションをArticleVOの属性フィールドに追加してから、@Validアノテーションをパラメーター検証メソッドに追加します。
[外部リンク画像の転送に失敗しました。ソースサイトにリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-ZFBNFoas-1644632559630)(images /screenshot_1597453255173.png)]
[外部リンク画像の転送に失敗しました、ソースサイトにある可能性がありますリーチ防止メカニズムの場合、画像を保存して直接アップロードすることをお勧めします(img-tfNVD8J1-1644632559631)(images /screenshot_1597453285578.png)]
ユーザー入力パラメータが検証ルールに準拠していない場合注釈で指定すると、BindExceptionまたはMethodArgumentNotValidExceptionがスローされます。
2.アサーションとIllegalArgumentExceptionをアサートします
以前に一般的な例外処理について説明したとき、ユーザー入力の例外判断はこのように処理されます。この方法も使用できますが、私たちはそれを最適化できるほど多くの知識を学びました。
//服务层,模拟用户输入数据导致的校验异常
public void userBizError(int input) {
if(input < 0){
//模拟业务校验失败逻辑
throw new CustomException(
CustomExceptionType.USER_INPUT_ERROR,
"您输入的数据不符合业务逻辑,请确认后重新输入!");
}
//…… 其他的业务
}
これを記述するためのより良い方法は次のとおりです。org.springframework.util.Assertを使用して、入力> = 0であることを表明します。条件が満たされない場合、IllegalArgumentExceptionがスローされ、パラメーターは無効になります。
//服务层,模拟用户输入数据导致的校验异常
public void userBizError(int input) {
Assert.isTrue(input >= 0,"您输入的数据不符合业务逻辑,请确认后重新输入!");
//…… 其他的业务
}
org.springframework.util.Assertアサーションは、さまざまなデータ型のデータの有効性を検証するための多数のアサーションメソッドを提供し、それを使用してコードを作成する方が便利です。
3.フレンドリーなデータ検証例外処理(ユーザー入力例外のグローバル処理)
データ検証が失敗すると、例外BindExceptionまたはMethodArgumentNotValidExceptionがスローされることがわかっています。したがって、プログラマーがコーディングを繰り返して問題を引き起こすのを防ぐために、これら2つの例外をグローバルに処理します。
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public AjaxResponse handleBindException(MethodArgumentNotValidException ex) {
FieldError fieldError = ex.getBindingResult().getFieldError();
return AjaxResponse.error(new CustomException(CustomExceptionType.USER_INPUT_ERROR,
fieldError.getDefaultMessage()));
}
@ExceptionHandler(BindException.class)
@ResponseBody
public AjaxResponse handleBindException(BindException ex) {
FieldError fieldError = ex.getBindingResult().getFieldError();
return AjaxResponse.error(new CustomException(CustomExceptionType.USER_INPUT_ERROR,
fieldError.getDefaultMessage()));
}
条件が満たされない場合、org.springframework.util.Assertアサーションを使用してIllegalArgumentExceptionをスローすることが知られています。次のグローバル例外ハンドラを使用できます
@ExceptionHandler(IllegalArgumentException.class)
@ResponseBody
public AjaxResponse handleIllegalArgumentException(IllegalArgumentException e) {
return AjaxResponse.error(
new CustomException(CustomExceptionType.USER_INPUT_ERROR,
e.getMessage())
);
}