Spring Boot はデータ検証に @Validated アノテーションをどのように使用しますか
アプリケーションを開発する場合、データ検証は避けられないことがよくあります。Spring Boot には、アプリケーション内のデータを検証するための多くのオプションが用意されており、その 1 つは@Validated
アノテーション。この記事では、データ検証に@Validated
アノテーションを、理解を深めるのに役立つサンプル コードをいくつか紹介します。
@Validated の概要
@Validated
メソッドパラメータ、リクエストパラメータ、リクエストボディを検証するための Spring Boot のアノテーションです。これjavax.validation
は@Valid
のアノテーションの拡張ですが、グループ検証やパラメータ検証順序など、より多くの機能を提供します。
@Validated
注釈 を使用する場合、spring-boot-starter-validation
バリデーターを使用するには、Spring Boot アプリケーションに依存関係を追加する必要があります。バリデーターは、オブジェクトとプロパティを検証するjavax.validation
パッケージ。
メソッドパラメータで @Validated を使用する
@Validated
アノテーションを使用する場合、アノテーションをメソッド パラメーターに配置して、メソッド パラメーターの有効性を検証できます。
@PostMapping("/users")
public User createUser(@RequestBody @Validated User user) {
// 处理用户创建逻辑
}
上記のコードでは、@Validated
アノテーションは@RequestBody
、User
アノテーションで渡されたオブジェクトが有効かどうかを検証するために使用されます。User
オブジェクトが無効な場合は、MethodArgumentNotValidException
例外がスローされます。この例外を処理するためにカスタム例外ハンドラーが必要な場合は、@ExceptionHandler
アノテーションを。
BindingResult
オブジェクトを使用して検証結果を取得することもできます。
@PostMapping("/users")
public User createUser(@RequestBody @Validated User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
// 处理验证错误
}
// 处理用户创建逻辑
}
上記のコードでは、検証エラーがある場合、BindingResult
オブジェクトにはそれらのエラーが含まれます。hasErrors()
メソッドを使用してエラーを確認し、getFieldErrors()
およびgetGlobalErrors()
メソッドをエラーのリストを取得できます。
リクエストパラメータで @Validated を使用する
@Validated
アノテーションを使用してリクエストパラメータを検証できます。この例では、@RequestParam
アノテーションリクエスト パラメーターを取得します。
@GetMapping("/users")
public User getUser(@RequestParam("id") @Min(1) Long id) {
// 处理获取用户逻辑
}
上記のコードでは、@Validated
アノテーションは@RequestParam
、id
アノテーションで渡されたパラメーターが有効かどうかを検証するために使用されます。id
無効な場合は、MethodArgumentNotValidException
例外がスローされます。
リクエスト本文で @Validated を使用します
@Validated
アノテーションを使用して、リクエスト本文内のオブジェクトを検証できます。この例では、@RequestBody
アノテーションリクエスト本文を取得します。
@PostMapping("/users")
public User createUser(@RequestBody @Validated User user) {
// 处理用户创建逻辑
}
上記のコードでは、@Validated
アノテーションは@RequestBody
、User
アノテーションで渡されたオブジェクトが有効かどうかを検証するために使用されます。User
オブジェクトが無効な場合は、MethodArgumentNotValidException
例外がスローされます。
チェックグループ
デフォルトでは、バリデーターはオブジェクトのすべてのアノテーションを検証します。ただし、検証を複数のグループに分けたい場合もあります。たとえば、オブジェクトを作成するときはすべてのプロパティを検証する必要があるが、オブジェクトを更新するときは必須のプロパティのみを検証する必要がある場合があります。
グループ化を定義するには、デフォルト グループには@javax.validation.groups.Default
アノテーションを、他のグループを定義するにはカスタム アノテーションを使用します。以下の例ではCreate
、Update
2 つのグループと を定義します。
public interface Create {}
public interface Update {}
public class User {
@NotNull(groups = Create.class)
private String name;
@NotNull(groups = {Create.class, Update.class})
private String email;
// getters/setters omitted
}
上記のコードでは、と の@NotNull
属性は とマークされていますが、それらの属性は異なります。属性はグループが、属性はおよび グループ内で検証されます。name
email
groups
name
Create
email
Create
Update
@Validated
注釈 を使用するときにグループを指定するには、そのグループを 2 番目の引数として@Validated
注釈に渡します。以下の例では、Create
グループを@Validated
アノテーションに渡します。
@PostMapping("/users")
public User createUser(@RequestBody @Validated(Create.class) User user) {
// 处理用户创建逻辑
}
上記のコードでは、@Validated
アノテーションはCreate
group、したがってname
属性のみを検証します。
カスタムバリデーターを定義する
場合によっては、組み込みのバリデーターがニーズを満たさない場合があります。たとえば、ユーザー名が一意であることを確認する必要がある場合がありますが、これにはデータベースへのアクセスが必要です。この場合、独自のバリデータを定義できます。
カスタム バリデータを定義するには、javax.validation.ConstraintValidator
インターフェイス。次の例では、ユーザー名が一意であることを検証するバリデータを作成します。
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {
@Autowired
private UserRepository userRepository;
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
return userRepository.findByUsername(value) == null;
}
}
上記のコードでは、 2 つの汎用パラメータを持つインターフェイスUniqueUsernameValidator
が実装されています。ConstraintValidator
最初のパラメータはカスタム アノテーションのタイプで、2 番目のパラメータは検証される値のタイプです。
isValid()
メソッドでは、value
であることを確認しnull
、そうでない場合は、同じユーザー名のユーザーがデータベース内にすでに存在するかどうかを確認します。存在しない場合は を返し、存在true
しない場合は を返しますfalse
。
カスタムバリデーターを定義した後、コードで使用するカスタムアノテーションを作成する必要があります。以下の例では、@UniqueUsername
アノテーション。
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {UniqueUsernameValidator.class})
public @interface UniqueUsername {
String message() default "用户名已存在";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
上記のコードでは、@Constraint
アノテーションをアノテーションUniqueUsernameValidator
と関連付けます。@UniqueUsername
また、デフォルトのエラー メッセージ、groups
およびpayload
グループ化とメタデータに使用できる属性も定義します。
これで、ユーザー名が一意であることを確認する必要がある場合はどこでも@UniqueUsername
注釈。
public class User {
@NotNull
@UniqueUsername
private String username;
// getters/setters omitted
}
上記のコードではusername
、@UniqueUsername
属性にアノテーションを使用しています。これにより、ユーザー名が一意であることを確認するために定義したカスタム バリデーターが呼び出されます。
要約する
この記事では、データ検証に@Validated
アノテーション。また、メソッド パラメーター、リクエスト パラメーター、リクエスト本文で@Validated
アノテーション。@Validated
注釈を使用すると、アプリケーション内のデータを簡単に検証し、データの整合性と一貫性を確保できます。