ホームページ  >  記事  >  Java  >  Spring Boot での検証用のカスタム アノテーションの作成

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

WBOY
WBOYオリジナル
2024-07-25 01:52:13439ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。