SpringBoot基礎教程2-1-8 資料驗證-自定義日期格式驗證
阿新 • • 發佈:2018-12-22
1 概述
javax.validation
包與hibernate-validator
包中註解能滿足大部分需求,但是還是有必要熟悉下自定義資料驗證註解,如日期格式驗證。
2 新增依賴
<dependencies>
<!-- 唯一需要依賴,預設就內嵌了Tomcat容器,如需要更換容器Jetty、Undertow也極其簡單-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--該依賴只會在編譯時呼叫-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16 .20</version>
<scope>provided</scope>
</dependency>
</dependencies>
3 自定義註解
定義一個@DateTime
註解
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DateTimeValidator.class)
public @interface DateTime {
String message() default "格式錯誤";
String format() default "yyyyMM";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Constraint
,指定校驗類message
,失敗提示資訊groups
,分組驗證(後面介紹)payload
,不知道,歡迎留言探討
4 實現具體驗證類
public class DateTimeValidator implements ConstraintValidator<DateTime, String> {
private DateTime dateTime;
@Override
public void initialize(DateTime dateTime) {
this.dateTime = dateTime;
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 如果 value 為空則不進行格式驗證,為空驗證可以使用 @NotBlank @NotNull @NotEmpty 等註解來進行控制,職責分離
if (value == null) {
return true;
}
String format = dateTime.format();
if (value.length() != format.length()) {
return false;
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
try {
simpleDateFormat.parse(value);
} catch (Exception e){
return false;
}
return true;
}
}
實現ConstraintValidator
介面,定義initialize
和isValid
方法。
- initialize
,主要用於初始化,它可以獲得當前註解的所有屬性
- isValid
,進行約束驗證的主體方法,其中 value
就是驗證引數的具體例項,context
代表約束執行的上下文環境。
5 實體類
@Data
public class User {
@NotNull(message = "名字不能為空")
@Length(min = 4, max = 10, message = "name 長度必須在 {min} - {max} 之間")
private String name;
@NotNull(message = "生日不能為空")
@DateTime(format = "yyyyMMdd", message = "格式錯誤,正確格式為:yyyyMMdd")
private String birthday;
}
6 控制層
@RestController
public class UserController {
@PostMapping("/user")
public R addUser(@Validated @RequestBody User user, BindingResult br) {
if (br.hasErrors()) {
return R.isFail().msg(br.getFieldError().getDefaultMessage());
} else {
return R.isOk().data(user);
}
}
}
7 測試結果
8 工程目錄
9 結束語
說點什麼呢,有任何建議,歡迎留言探討,本文原始碼。
歡迎關注博主公眾號,第一時間推送最新文章