Spring Boot はデータ検証に @Validated アノテーションをどのように使用しますか

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アノテーションは@RequestBodyUserアノテーションで渡されたオブジェクトが有効かどうかを検証するために使用されます。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アノテーションは@RequestParamidアノテーションで渡されたパラメーターが有効かどうかを検証するために使用されます。id無効な場合は、MethodArgumentNotValidException例外がスローされます。

リクエスト本文で @Validated を使用します

@Validatedアノテーションを使用して、リクエスト本文内のオブジェクトを検証できます。この例では、@RequestBodyアノテーションリクエスト本文を取得します。

@PostMapping("/users")
public User createUser(@RequestBody @Validated User user) {
    // 处理用户创建逻辑
}

上記のコードでは、@Validatedアノテーションは@RequestBodyUserアノテーションで渡されたオブジェクトが有効かどうかを検証するために使用されます。Userオブジェクトが無効な場合は、MethodArgumentNotValidException例外がスローされます。

チェックグループ

デフォルトでは、バリデーターはオブジェクトのすべてのアノテーションを検証します。ただし、検証を複数のグループに分けたい場合もあります。たとえば、オブジェクトを作成するときはすべてのプロパティを検証する必要があるが、オブジェクトを更新するときは必須のプロパティのみを検証する必要がある場合があります。

グループ化を定義するには、デフォルト グループには@javax.validation.groups.Defaultアノテーションを、他のグループを定義するにはカスタム アノテーションを使用します。以下の例ではCreateUpdate2 つのグループと を定義します。

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属性は とマークされていますが、それらの属性は異なります。属性はグループが、属性はおよび グループ内で検証されます。nameemailgroupsnameCreateemailCreateUpdate

@Validated注釈 を使用するときにグループを指定するには、そのグループを 2 番目の引数として@Validated注釈に渡します。以下の例では、Createグループを@Validatedアノテーションに渡します。

@PostMapping("/users")
public User createUser(@RequestBody @Validated(Create.class) User user) {
    // 处理用户创建逻辑
}

上記のコードでは、@ValidatedアノテーションはCreategroup、したがって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注釈を使用すると、アプリケーション内のデータを簡単に検証し、データの整合性と一貫性を確保できます。

おすすめ

転載: blog.csdn.net/2302_77835532/article/details/131341704