Hibernate-Validation的使用和常用的註解
@AssertTrue //用於boolean欄位,該欄位只能為true @AssertFalse//該欄位的值只能為false @CreditCardNumber//對信用卡號進行一個大致的驗證 @DecimalMax//只能小於或等於該值 @DecimalMin//只能大於或等於該值 @Digits(integer=2,fraction=20)//檢查是否是一種數字的整數、分數,小數位數的數字。 @Email//檢查是否是一個有效的email地址 @Future//檢查該欄位的日期是否是屬於將來的日期 @Length(min=,max=)//檢查所屬的欄位的長度是否在min和max之間,只能用於字串 @Max//該欄位的值只能小於或等於該值 @Min//該欄位的值只能大於或等於該值 @NotNull//不能為null @NotBlank//不能為空,檢查時會將空格忽略 @NotEmpty//不能為空,這裡的空是指空字串 @Null//檢查該欄位為空 @Past//檢查該欄位的日期是在過去 @Size(min=, max=)//檢查該欄位的size是否在min和max之間,可以是字串、陣列、集合、Map等 @URL(protocol=,host,port)//檢查是否是一個有效的URL,如果提供了protocol,host等,則該URL還需滿足提供的條件 @Valid//該註解只要用於欄位為一個包含其他物件的集合或map或陣列的欄位,或該欄位直接為一個其他物件的引用, //這樣在檢查當前物件的同時也會檢查該欄位所引用的物件
@NotEmpty,@NotNull和@NotBlank的區別
1 @NotEmpty :不能為null,且Size>0
2 @NotNull:不能為null,但可以為empty,沒有Size的約束
3 @NotBlank:只用於String,不能為null且trim()之後size>0
1.建立自定義校驗器
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;
@Target({ ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = MyConstraintValidator.class) public @interface MyConstraint { /** * @Description: 錯誤提示 */ String message() default "請輸入正確性別";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { }; }
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext;
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> { //String為校驗的型別 @Override public void initialize(MyConstraint myConstraint) { //啟動時執行 }
/** * @Description: 自定義校驗邏輯 */ @Override public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { if (!(s.equals("男") || s.equals("女"))) return false; return true; } }
@Target用於指定使用範圍,該處限定只能在欄位上使用 @Retention(RetentionPolicy.RUNTIME)表示註解在執行時可以通過反射獲取到 @Constraint(validatedBy = xxx.class)指定該註解校驗邏輯 2.建立校驗實體,使用Hibernate Validator自帶註解以及自定義的註解
import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.Length;
//@Data為lombok註解,用於省略get(),set()方法 @Data public class User { @Length(min = 8, max = 18, message = "使用者名稱長度必須為8-18") private String username;
@Length(min = 8, max = 18, message = "密碼長度必須為8-18") private String password;
@MyConstraint private String sex;
@Email private String email; }
3.寫一個controller
import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController public class UserController { @PutMapping("/user") public String test(@Valid @RequestBody User user, BindingResult result){ StringBuilder sb = new StringBuilder(); if (result.hasErrors()){ //記錄錯誤資訊 result.getAllErrors().stream() .forEach(error -> sb.append(error.getDefaultMessage() + "/")); } return sb.toString(); } }