hibernate validator

22637 ワード

背景
インタフェースを作成するときには、入力パラメータが空であるかどうか、数値であるかどうか、合法的な日付フォーマットであるかどうかなど、入力パラメータが合法であるかどうかを検証する必要があります.このようなニーズをコードで実現するのも複雑ではありませんが、各インタフェースが重複作業を行うのは合理的ではありません.これに基づいて、hibernate validatorは一連の注釈を提供し、これらの作業を完了します.
使用方法
1、検証文字列を空にすることはできません
  • オブジェクトのプロパティに@NotEmpty注記
  • を追加
    public class User {
    
        private Integer id;
    
        @NotEmpty
        private String username;
    
        @NotEmpty
        private String password;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    
  • インタフェースで@Valid注記
  • を使用
    	@PutMapping
        public User addUser(@RequestBody @Valid User user, BindingResult errors, HttpServletResponse response) {
            if (errors.hasErrors()) {
                errors.getAllErrors().forEach(error -> System.out.println(((FieldError) error).getField() + "" + error.getDefaultMessage()));
                response.setStatus(400);
                return user;
            }
            return iUserService.addUser(user);
        }
    

    このとき、このインタフェースを呼び出したクライアントがusernameまたはpasswordの値を送信していない場合、要求はhibernate validatorによってブロックされ、BindingResultオブジェクトに異常情報がカプセル化され、ここではExceptionクラスに異常情報をカプセル化してクライアントに戻ることができます.2、検査日は今日までにしなければなりません.方式は非空チェックと同じです
  • エンティティークラスに@Pass注記
  • を追加
    	@Past
        private Date birthday;
    
  • インタフェースに@Valid注記
  • を追加
    	@PutMapping
        public User addUser(@RequestBody @Valid User user, BindingResult errors, HttpServletResponse response) {
            if (errors.hasErrors()) {
                errors.getAllErrors().forEach(error -> System.out.println(((FieldError) error).getField() + "" + error.getDefaultMessage()));
                response.setStatus(400);
                return user;
            }
            return iUserService.addUser(user);
        }
    

    以下はサポートされているすべての注釈です.使用方法は同じです.
    注記名
    説明する
    @NotNull
    値を空にすることはできません
    @Null
    値は空でなければなりません
    @Pattern(regex=)
    文字列は正規表現に一致する必要があります
    @Size(min=, max=)
    集合の要素数はminとmaxの間でなければなりません
    @CreditCardNumber(ignoreNonDigitCharacters=)
    文字列はクレジットカード番号でなければなりません(アメリカの標準に従って検証!!)
    @Email
    文字列はEmailアドレスでなければなりません
    @Length(min=, max=)
    文字列の長さをチェック
    @NotBlank
    文字列には文字が必要です
    @NotEmpty
    文字列はnullではなく、集合に要素があります.
    @Range(min=, max=)
    数値はmin以上max以下でなければなりません
    @SafeHtml
    文字列は安全なhtmlです
    @URL
    文字列は正当なURLです
    @AssertFalse
    値はfalseでなければなりません
    @AssertTrue
    値はtrueでなければなりません
    @DecimalMax(value=, inclusive=)
    値は、(inclusive=true)/(inclusive=false)value属性で指定した値以下でなければなりません.文字列タイプの属性に注記できます.
    @DecimalMin(value=, inclusive=)
    値は、(inclusive=true)/(inclusive=false)value属性で指定した値以上でなければなりません.文字列タイプの属性に注記できます.
    @Digits(integer=, fraction=)
    数値フォーマットチェック.Integerは整数部の最大長、fractionは小数部の最大長を指定します
    @Future
    値は将来の日付でなければなりません
    @Past
    値は過去の日付でなければなりません
    @Max(value=)
    値はvalueで指定した値以下でなければなりません.文字列タイプのプロパティに注記できません
    @Min(value=)
    値はvalueで指定した値以上でなければなりません.文字列タイプのプロパティに注記できません
    カスタム注釈実装
    新しいユーザーを追加する場合は、ユーザー名が重複しているかどうかを確認する必要があります.重複している場合は、ユーザー名の変更を求めるプロンプトが表示されます.これはカスタムvalidator注釈を使用して実現することもできます
  • 注釈クラス
  • を作成する
    import javax.validation.Constraint;
    import javax.validation.Payload;
    import javax.validation.constraints.NotNull;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @NotNull
    @Target({ElementType.METHOD, ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = UserConstraintValidator.class)
    public @interface UsernameNotRepeat {
    
        String message();
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    
    

    @NotNull:注釈を表すフィールドが空ではありません@Target({ElementType.METHOD,ElementType.FIELD}):この注釈はメソッドとフィールド@Retention(RetentionPolicy.RUNTIME):注釈のライフサイクルに適用され、注釈はclassファイルに保存されるだけでなく、jvmがclassファイルをロードした後、@Constraint(validatedBy=U s e r ConstraintValidator.class):実際のビジネス実行クラスは、ユーザー名が重複しているかどうかを確認する必要があります.
  • ビジネス実行クラス
  • を作成する.
    import com.mright.security.demo.platform.entity.User;
    import com.mright.security.demo.platform.service.IUserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    
    public class UserConstraintValidator implements ConstraintValidator<UsernameNotRepeat, String> {
    
        @Autowired
        private IUserService iUserService;
    
        @Override
        public void initialize(UsernameNotRepeat userConstraint) {
    
        }
    
        @Override
        public boolean isValid(String username, ConstraintValidatorContext constraintValidatorContext) {
            User user = iUserService.getUserByUsername(username);
            return user == null;
        }
    
    }
    

    ここでは、validatorに属するサブクラスを表すConstraintValidatorインタフェースを実装する必要があります.注釈チェックに使用できます.@Autowiredを直接使用してサービスに注入してクエリーなどのビジネス操作を実行し、最終的にユーザー名がすでに存在するかどうかを返すことができます.
  • 注釈の作成後、実際の使用、hibernate validatorのデフォルト注釈の使用は、
  • に等しくありません.
        @UsernameNotRepeat(message = "       ")
        private String username;
    
    	@PutMapping
        public User addUser(@RequestBody @Valid User user, BindingResult errors, HttpServletResponse response) {
            if (errors.hasErrors()) {
                errors.getAllErrors().forEach(error -> System.out.println(((FieldError) error).getField() + "" + error.getDefaultMessage()));
                response.setStatus(400);
                return user;
            }
            return iUserService.addUser(user);
        }
    

    これで、ユーザー名の重複しないチェックが完了しました