Spring Boot での検証用のカスタム アノテーションの作成

WBOY
リリース: 2024-07-25 01:52:13
オリジナル
495 人が閲覧しました

Creating Custom Annotations for Validation in Spring Boot

Spring Boot での検証用のカスタム アノテーションの作成

1. 概要

Spring の標準アノテーション (@NotBlank、@NotNull、@Min、@Size など) はユーザー入力を検証する際の多くのユースケースをカバーしていますが、より具体的なタイプの入力に対してカスタム検証ロジックを作成する必要がある場合があります。 。この記事では、検証用のカスタム アノテーションを作成する方法を説明します。

2. セットアップ

spring-boot-starter-validation 依存関係を pom.xml ファイルに追加する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
ログイン後にコピー

3. カスタムフィールドレベルの検証

3.1 アノテーションの作成

ファイル拡張子、ファイル サイズ、MIME タイプなどのファイル属性を検証するカスタム アノテーションを作成しましょう。

  • 有効なファイル拡張子
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {FileExtensionValidator.class}
)
public @interface ValidFileExtension {
    String[] extensions() default {};

    String message() default "{constraints.ValidFileExtension.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
ログイン後にコピー
  • ValidFileMaxSize
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {FileMaxSizeValidator.class}
)
public @interface ValidFileMaxSize {
    long maxSize() default Long.MAX_VALUE; // MB

    String message() default "{constraints.ValidFileMaxSize.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

ログイン後にコピー
  • FileMimeTypeValidator
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {FileMimeTypeValidator.class}
)
public @interface ValidFileMimeType {
    String[] mimeTypes() default {};

    String message() default "{constraints.ValidFileMimeType.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
ログイン後にコピー

これらのアノテーションのコンポーネントを分解してみましょう:

  • @Constraint: 検証ロジックを担当するバリデーター クラスを指定します。
  • @Target({ElementType.FIELD}): このアノテーションがフィールドにのみ適用できることを示します。
  • message(): 検証が失敗した場合のデフォルトのエラーメッセージ。

3.2 バリデーターの作成

  • FileExtensionValidator
public class FileExtensionValidator implements ConstraintValidator<ValidFileExtension, MultipartFile> {

    private List<String> extensions;

    @Override
    public void initialize(ValidFileExtension constraintAnnotation) {
        extensions = List.of(constraintAnnotation.extensions());
    }

    @Override
    public boolean isValid(MultipartFile file, ConstraintValidatorContext constraintValidatorContext) {
        if (file == null || file.isEmpty()) {
            return true;
        }
        var extension = FilenameUtils.getExtension(file.getOriginalFilename());
        return StringUtils.isNotBlank(extension) && extensions.contains(extension.toLowerCase());
    }
}
ログイン後にコピー
  • FileMaxSizeValidator
public class FileMaxSizeValidator implements ConstraintValidator<ValidFileMaxSize, MultipartFile> {

    private long maxSizeInBytes;

    @Override
    public void initialize(ValidFileMaxSize constraintAnnotation) {
        maxSizeInBytes = constraintAnnotation.maxSize() * 1024 * 1024;
    }

    @Override
    public boolean isValid(MultipartFile file, ConstraintValidatorContext constraintValidatorContext) {
        return file == null || file.isEmpty() || file.getSize() <= maxSizeInBytes;
    }
}

ログイン後にコピー
  • FileMimeTypeValidator
@RequiredArgsConstructor
public class FileMimeTypeValidator implements ConstraintValidator<ValidFileMimeType, MultipartFile> {

    private final Tika tika;
    private List<String> mimeTypes;

    @Override
    public void initialize(ValidFileMimeType constraintAnnotation) {
        mimeTypes = List.of(constraintAnnotation.mimeTypes());
    }

    @SneakyThrows
    @Override
    public boolean isValid(MultipartFile file, ConstraintValidatorContext constraintValidatorContext) {
        if (file == null || file.isEmpty()) {
            return true;
        }
        var detect = tika.detect(TikaInputStream.get(file.getInputStream()));
        return mimeTypes.contains(detect);
    }
}

ログイン後にコピー

これらのクラスは ConstraintValidator インターフェイスの実装であり、実際の検証ロジックが含まれています。
FileMimeTypeValidator の場合は、Apache Tika (さまざまな種類のドキュメントからメタデータとコンテンツを抽出するように設計されたツールキット) を使用します。

3.3 アノテーションの適用

ファイルのアップロード、特に PDF ファイルの処理を目的とした TestUploadRequest クラスを作成しましょう。

@Data
public class TestUploadRequest {

    @NotNull
    @ValidFileMaxSize(maxSize = 10)
    @ValidFileExtension(extensions = {"pdf"})
    @ValidFileMimeType(mimeTypes = {"application/pdf"})
    private MultipartFile pdfFile;

}

ログイン後にコピー
@RestController
@Validated
@RequestMapping("/test")
public class TestController {

    @PostMapping(value = "/upload", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
    public ResponseEntity<String> testUpload(@Valid @ModelAttribute TestUploadRequest request) {
        return ResponseEntity.ok("test upload");
    }
}

ログイン後にコピー
  • @Target({ElementType.TYPE}): このアノテーションが型宣言をターゲットとすることを示します。

4. カスタムクラスレベルの検証

カスタム検証アノテーションをクラス レベルで定義して、クラス内のフィールドの組み合わせを検証することもできます。

4.1 アノテーションの作成

@PasswordMatches アノテーションを作成して、クラス内の 2 つのパスワード フィールドが一致することを確認しましょう。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = {PasswordMatchesValidator.class}
)
public @interface PasswordMatches {
    String message() default "{constraints.PasswordMatches.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

ログイン後にコピー

4.2 バリデーターの作成

  • パスワードDto
public interface PasswordDto {
    String getPassword();

    String getConfirmPassword();
}


ログイン後にコピー
  • パスワード一致検証者
public class PasswordMatchesValidator implements ConstraintValidator<PasswordMatches, PasswordDto> {

    @Override
    public boolean isValid(PasswordDto password, ConstraintValidatorContext constraintValidatorContext) {
        return StringUtils.equals(password.getPassword(), password.getConfirmPassword());
    }
}

ログイン後にコピー

PasswordDto インターフェースは、パスワードとパスワード確認フィールドを含むオブジェクトのインターフェースです。
PasswordMatchesValidator クラスは ConstraintValidator インターフェイスを実装し、パスワード フィールドとパスワード確認フィールドが一致することを検証するロジックを含みます。

4.3 注釈の適用

ユーザー登録データを処理するための RegisterAccountRequest クラスを作成しましょう。

@PasswordMatches
@Data
public class RegisterAccountRequest implements PasswordDto {

    @NotBlank
    private String username;

    @NotBlank
    @Email
    private String email;

    @NotBlank
    @ToString.Exclude
    private String password;

    @NotBlank
    @ToString.Exclude
    private String confirmPassword;
}

ログイン後にコピー
@RestController
@Validated
@RequestMapping("/auth")
public class AuthController {

    @PostMapping("/register")
    public ResponseEntity<String> register(@RequestBody @Valid RegisterAccountRequest request) {
        return ResponseEntity.ok("register success");
    }
}

ログイン後にコピー

5. まとめ

この短い記事では、フィールドまたはクラスを検証するためのカスタム アノテーションを作成することがいかに簡単であるかを発見しました。この記事のコードは私の Github から入手できます。

  • スプリングブートマイクロサービス
  • ユーザーサービス

6. 参考文献

  • ベルドゥン。 (未確認)。 Spring MVC カスタムバリデーター。取得しました https://www.baeldung.com/spring-mvc-custom-validator より

以上がSpring Boot での検証用のカスタム アノテーションの作成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート