javax.validation
包與hibernate-validator
包中註解能知足大部分需求,可是仍是有必要熟悉下自定義數據驗證註解,如日期格式驗證。java
<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>
定義一個@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
,不知道,歡迎留言探討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
方法。github
initialize
,主要用於初始化,它能夠得到當前註解的全部屬性isValid
,進行約束驗證的主體方法,其中 value
就是驗證參數的具體實例,context
表明約束執行的上下文環境。@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; }
@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); } } }
說點什麼呢,有任何建議,歡迎留言探討,本文源碼。web
歡迎關注博主公衆號,第一時間推送最新文章spring