1 概述
后台單獨對接收到的參數進行驗證時比較麻煩,springboot項目的web組件(spring-boot-starter-web)集成了hibernate-validator,開發者可以直接使用hibernate-validator提供的注解對數據進行校驗,當有一些復雜的參數校驗時我們也可以自定義校驗注解
2、先定義一個注解
package com.ideatech.ams.ws.validate; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = DateTimeValidator.class) public @interface DateTimeStr { String message() default "{javax.validation.constraints.DateTimeStr.message}"; String format() default "yyyy-MM-dd HH:mm:ss"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
@Constraint,指定校驗類
message,失敗提示信息
groups,分組驗證(后面介紹)
payload,不知道,歡迎留言探討
2、編寫校驗類
package com.ideatech.ams.ws.validate; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.lang.annotation.Annotation; import java.text.SimpleDateFormat; public class DateTimeValidator implements ConstraintValidator<DateTimeStr,String>{ private DateTimeStr dateTimeStr; @Override public void initialize(DateTimeStr dateTimeStr) { this.dateTimeStr=dateTimeStr; } @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 如果 value 為空則不進行格式驗證,為空驗證可以使用 @NotBlank @NotNull @NotEmpty 等注解來進行控制,職責分離 if (value == null) { return true; } String format = dateTimeStr.format(); if (value.length() != format.length()) { return false; } SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); try { simpleDateFormat.parse(value); } catch (Exception e){ return false; } return true; } }
1:必須實現ConstraintValidator接口
2:實現了ConstraintValidator接口后即使不進行Bean配置,spring也會將這個類進行Bean管理
3:可以在實現了ConstraintValidator接口的類中依賴注入其它Bean
4:實現了ConstraintValidator接口后必須重寫 initialize 和 isValid 這兩個方法;initialize方法主要來進行初始化,通常用來獲取自定義注解的屬性值;isValid 方法主要進行校驗邏輯,返回true表示校驗通過,返回false表示校驗失敗,通常根據注解屬性值和實體類屬性值進行校驗判斷
/** * 銀行通知客戶臨櫃時間(必填) */ @NotBlank(message="銀行通知客戶臨櫃時間不能為空") @DateTimeStr(format ="yyyy-MM-dd HH:mm:ss", message = "格式錯誤,正確格式為:yyyy-MM-dd HH:mm:ss") private String bankApplyTime;