hibernate validator
22637 ワード
背景
インタフェースを作成するときには、入力パラメータが空であるかどうか、数値であるかどうか、合法的な日付フォーマットであるかどうかなど、入力パラメータが合法であるかどうかを検証する必要があります.このようなニーズをコードで実現するのも複雑ではありませんが、各インタフェースが重複作業を行うのは合理的ではありません.これに基づいて、hibernate validatorは一連の注釈を提供し、これらの作業を完了します.
使用方法
1、検証文字列を空にすることはできませんオブジェクトのプロパティに@NotEmpty注記 を追加インタフェースで@Valid注記 を使用
このとき、このインタフェースを呼び出したクライアントがusernameまたはpasswordの値を送信していない場合、要求はhibernate validatorによってブロックされ、BindingResultオブジェクトに異常情報がカプセル化され、ここではExceptionクラスに異常情報をカプセル化してクライアントに戻ることができます.2、検査日は今日までにしなければなりません.方式は非空チェックと同じですエンティティークラスに@Pass注記 を追加インタフェースに@Valid注記 を追加
以下はサポートされているすべての注釈です.使用方法は同じです.
注記名
説明する
@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注釈を使用して実現することもできます注釈クラス を作成する
@NotNull:注釈を表すフィールドが空ではありません@Target({ElementType.METHOD,ElementType.FIELD}):この注釈はメソッドとフィールド@Retention(RetentionPolicy.RUNTIME):注釈のライフサイクルに適用され、注釈はclassファイルに保存されるだけでなく、jvmがclassファイルをロードした後、@Constraint(validatedBy=U s e r ConstraintValidator.class):実際のビジネス実行クラスは、ユーザー名が重複しているかどうかを確認する必要があります.ビジネス実行クラス を作成する.
ここでは、validatorに属するサブクラスを表すConstraintValidatorインタフェースを実装する必要があります.注釈チェックに使用できます.@Autowiredを直接使用してサービスに注入してクエリーなどのビジネス操作を実行し、最終的にユーザー名がすでに存在するかどうかを返すことができます.注釈の作成後、実際の使用、hibernate validatorのデフォルト注釈の使用は、 に等しくありません.
これで、ユーザー名の重複しないチェックが完了しました
インタフェースを作成するときには、入力パラメータが空であるかどうか、数値であるかどうか、合法的な日付フォーマットであるかどうかなど、入力パラメータが合法であるかどうかを検証する必要があります.このようなニーズをコードで実現するのも複雑ではありませんが、各インタフェースが重複作業を行うのは合理的ではありません.これに基づいて、hibernate validatorは一連の注釈を提供し、これらの作業を完了します.
使用方法
1、検証文字列を空にすることはできません
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;
}
}
@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、検査日は今日までにしなければなりません.方式は非空チェックと同じです
@Past
private Date birthday;
@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アドレスでなければなりません
@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を直接使用してサービスに注入してクエリーなどのビジネス操作を実行し、最終的にユーザー名がすでに存在するかどうかを返すことができます.
@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);
}
これで、ユーザー名の重複しないチェックが完了しました