Spring Boot系列(四) Spring Boot 之驗證

這節沒有高深的東西, 但有一些學習思路值得借鑑.java

JSR 303 (Bean Validation)spring

Maven依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Spring Boot 1.4 開始提出命名規則, 官方使用spring-boot-starter-${name} , 三方使用 {name}-spring-boot-starter.maven

使用

通常只須要在須要驗證的請求參數加 @Valid 便可. 對於通用的驗證 annotation 如 @NotNull , @Max 等, 不須要作任何其餘操做.spring-boot

Spring 也提供了 API 形式的斷言, 如 Assert.hasText(user.getName(),"字段值不能爲空")學習

Java 的斷言有專門的關鍵字, 如 assert user.getId()>1000code

斷言耦合了業務邏輯. 避免耦合能夠使用 HandlerIntercepter 或者 Filter 作攔截. 也能夠使用 AOP 切面來完成. 但上述均不是統一的標準實現.xml

自定義驗證邏輯

參考 Spring 已經實現的其餘驗證邏輯.ci

  1. 定義註解
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { })
public @interface Card {
  1. 理解註解上的 @Constraint,get

  2. 實現 public interface ConstraintValidator<A extends Annotation, T>it

爲何不建議使用 String.split()? 由於其使用了正則, 其次容易出異常. 建議使用三方封裝. 能夠使用StringUtils.delimitedListToStringArray() 或 commons-lang3包的 StringUtils 或使用 JDK 的 StringTokenizer.

  1. 註解 Card 上修改 @Constraint(validatedBy = { CardValidation }) 指定驗證的類.

  2. 經過定義相似 String message() default "{javax.validation.constraints.DecimalMax.message}"; 能夠實現國際化.

相關文章
相關標籤/搜索