最近在開發某個模塊的功能時,裏面包含大量對請求參數判空和驗證的步驟且參數繁多,存在大量的重複判斷,驗證影響代碼的美觀遂決定優化這部分代碼。SpringBoot自帶了參數驗證框Hibernate Validator
,下面是本身的學習筆記。html
若使用SptingBoot,在
spring-boot-starter-web
包中包含此框架依賴,其餘框架加入依賴便可
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.17.Final</version> </dependency>
新建類User
java
package com.longhc.uublog; import com.alibaba.fastjson.JSON; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import java.io.Serializable; @Getter @Setter @NoArgsConstructor public class User implements Serializable { private static final long serialVersionUID = -2164567260938543876L; private String userId; // 字段userName不可爲null,且length>0 @NotBlank private String userName; // 密碼須要匹配正則表達式 @Pattern(regexp = "^[A-Z]{0,3}[0-9]{5,10}") private String password; // 驗證是不是正確的電子郵件格式 @Email private String email; // 家庭住址不爲空 @NotNull private String address; @Override public String toString() { return JSON.toJSONString(this); } }
Validator
校驗傳入參數是否符合規則package com.longhc.uublog; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.util.Set; @Slf4j public class VaildatorTest { @Test public void test() { // 得到默認的Validator Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Consumer consumer = new Consumer(); consumer.setUserName("longhaicheng"); consumer.setAddress(null); consumer.setEmail("123456789"); // 驗證consumer是否符合要求,並返回set集合,若set集合size()返回>0,說明存在違規的參數,經過日誌打印 Set<ConstraintViolation<Consumer>> constraintViolations = validator.validate(consumer); if (constraintViolations.size() > 0) { for (ConstraintViolation<Consumer> constraintViolation : constraintViolations) { String message = constraintViolation.getMessage(); log.error("message:{}", message); } } } }
message
屬性配置@NotBlank(message = "字段[userName]不可爲空") @Pattern(regexp = "^[A-Z]{0,3}[0-9]{5,10}",message = "字段[password]需匹配表達式[{regexp}]") @Email(message = "錯誤的電子郵箱格式") @NotNull(message = "家庭住址不爲空")
package com.longhc.uublog; import lombok.extern.slf4j.Slf4j; import org.hibernate.validator.HibernateValidator; import org.springframework.stereotype.Component; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.util.Set; @Component @Slf4j public class ValidatorUtil { public static Validator getValidator() { // 使用HibernateValidator Validator validator = Validation.byProvider(HibernateValidator.class) .configure() // 快速失敗(即:第一個參數校驗失敗就返回錯誤信息,而不是校驗全部的參數,並一次性返回全部的錯誤信息) .failFast(true) .buildValidatorFactory() .getValidator(); return validator; } /** * @param object object * @param groups groups */ public void validateObject(Object object, Class<?>... groups) { Set<ConstraintViolation<Object>> constraintViolations = getValidator().validate(object, groups); if (constraintViolations.size() > 0) { for (ConstraintViolation<Object> constraintViolation : constraintViolations) { String message = constraintViolation.getMessage(); log.error("errorMessage:{}", message); } } } }