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

1 概述

javax.validation包與hibernate-validator包中註解能知足大部分需求,可是仍是有必要熟悉下自定義數據驗證註解,如日期格式驗證java

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註解git

@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方法。github

  • 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 結束語

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


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

歡迎關注博主公衆號

相關文章
相關標籤/搜索