<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.9.Final</version> </dependency>
@Validator註解表示對當前參數的約束生效
經常使用的約束註解爲
@NotNull 表示的對象不能爲null
@Null 表示的對象只能爲null
@NotEmpty 對於字符串表示的是不能爲空字符串,對於數組表示的是不能爲空數組
@NotBlank 表示的是 字符串 去掉全部空格 相似str.trim() 之後不能爲空和null
@Min 若是爲字符串表示的是 字符串的長度,若是爲數字表示的是數字的大小,若是爲list表示的是list的最小長度
@Size 若是爲字符串表示的是 字符串的長度,若是爲數字表示的是數字的大小,若是爲list表示的是list的最小長度
@Max 若是爲字符串表示的是 字符串的長度,若是爲數字表示的是數字的大小,若是爲list表示的是list的最小長度spring
其中@Validated 做用到類
ValidUserBo
上表示對ValidUserBo
中的參數name
進行驗證不能爲空,若是爲空,則result.hasErrors()
中則顯示存在異常信息, 若是方法中定義啦BindingResult
類,則不會拋出異常;每一個方法中都要進行處理;不推薦使用數組
@Data public class ValidUserBo { @NotNull(message = "name 不能爲null") private String name; } @GetMapping("/get/valid") public ResponseVO valid(@Validated ValidUserBo validUserBo, BindingResult result) { if (result.hasErrors()) { throw new IllegalArgumentException("驗證異常"); } return ResponseUtil.success(); }
在方法中,不定義
BindingResult
則會吧異常進行拋出,而後用spring
統一異常進行處理app
@Data public class ValidUserBo { @NotNull(message = "name 不能爲null") private String name; } @GetMapping("/get/valid") public ResponseVO valid(@Validated ValidUserBo validUserBo) { return ResponseUtil.success(); } //統一異常處理 @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = BindException.class) public ResponseVO personException(BindException e){ log.info("GlobalExceptionHandler.personException ", e); return ResponseUtil.fail(.getFieldError().getDefaultMessage()); } } @Builder @AllArgsConstructor @Getter @Setter public class ResponseVO<T> { private int code; private String message; private T obj; }
對於指定使用參數驗證,要使用到的是
@Validated(ValidUserBo.Name.class)
模式,此處驗證的是group
爲Name
類的參數才進行驗證;ide
@Data public class ValidUserBo { @NotNull(message = "name 不能爲null", groups = {Name.class}) private String name; @NotNull(message = "name1 不能爲null") private String name1; public interface Name{} } //使用方式: @GetMapping("/get/valid") public ResponseVO valid(@Validated(ValidUserBo.Name.class) ValidUserBo validUserBo) { return ResponseUtil.success(); } //此時驗證的時候,只會驗證 name不能爲空,而name1 則不進行任何驗證;
定義註解:ui
@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE}) @Constraint(validatedBy = CheckSql.class) //表示對應約束的類 public @interface PhoneNo { String message() default "手機號碼無效"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
定義類信息:.net
//註解兩個參數 第一個表示的是,當前註解,第二個表示的是,定義到的字段 public class CheckSql implements ConstraintValidator<PhoneNo, String> { @Override public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { if (s .equals("187")) { return true; } return false; } }
用法:hibernate
public class ValidUserBo { @PhoneNo(message = "號碼有誤", groups = {Name.class}) public String phone; public interface Name{} }