1. 程式人生 > >SpringBoot基礎教程2-1-8 資料驗證-自定義日期格式驗證

SpringBoot基礎教程2-1-8 資料驗證-自定義日期格式驗證

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介面,定義initializeisValid方法。
- 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 結束語

說點什麼呢,有任何建議,歡迎留言探討,本文原始碼

歡迎關注博主公眾號,第一時間推送最新文章

歡迎關注博主公眾號