前言
Bean Validation是一個驗證參數的規範,能簡化代碼,讓我們儘量避免寫很多的冗餘的代碼來校驗輸入參數的正確性,特別是暴露給外部用的api,必須要做參數驗證,下面就將常用的驗證方式做一個記錄。
步驟
1) pom中引入Bean validation的實現hibernate-validator
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
2)定義接收參數的實體,加上驗證註解
@NotNull(message = "姓名不能爲空!")
private String name;
@NotEmpty(message = "手機號不能爲空及空字符")
@Size(min = 11, max = 11, message = "手機號爲11位")
private String phone;
3) 創建校驗器,編寫測試類
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
/**
* 校驗規則:object != null;
*/
@Test
public void testNotNull(){
User user = new User();
user.setName("俠夢"); //size=0
// user.setName(""); //size =0
// user.setName(null); //size = 1
Set<ConstraintViolation<User>> violations = validator.validate(user);
Assert.assertEquals(violations.size(),0);
}
4) 結合java8昇華校驗
校驗集合內部的元素,注意正確寫法是寫在聲明的泛型類型前面,而不是像傳統校驗一樣另起一行,這樣會導致異常No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.util.List
private List<@NotBlank(message = "存在的郵箱元素不能爲空") String> emails;
private Map<@Email String, @NotNull User> customers;
結合Optional校驗
private Integer age;
public Optional<@Min(18) Integer> getAge() {
return Optional.ofNullable(age);
}
5)自定義驗證器
開發中,經常會有很多字段,固定就只能是一些範圍內的值,我們可以自定義一個驗證器來約束它們,例如:用戶來源這個字段,只會有三種,微信、qq和微博,首先我們定義一個@interface註解,通過Constraint的validatedBy指定一個驗證器,在驗證器中,實現ConstraintValidator接口,覆寫isValid方法,讓@UserSource校驗的字段,只能是這三個值。
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD })
@Constraint(validatedBy = {UserTypeValidator.class})
@Documented
public @interface UserSource {
String message() default "用戶來源不正確,請檢查!";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class UserTypeValidator implements ConstraintValidator<UserSource, String> {
private List<String> sources = Arrays.asList(new String[]{"wechat","qq","weibo"});
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return sources.contains(value);
}
}
@UserSource(message = "錯誤的用戶來源!")
private String source;
6)總結
日常開發中,大多都沒有在數據庫設置外鍵關係,而是用應用程序來維護,所以參數的校驗是十分重要的,在程序保存記錄前,可以使用validation來校驗輸入的參數,如果不滿足規則,則拋出異常,避免存入髒數據。
本文分享自微信公衆號 - 俠夢的開發筆記(xmdevnote)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。