1. 程式人生 > >Spring Boot系列(四) Spring Boot 之驗證

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

sse star split jsr 303 boot public mes 定義 runtime

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

JSR 303 (Bean Validation)

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

.

使用

一般只需要在需要驗證的請求參數加 @Valid 即可. 對於通用的驗證 annotation 如 @NotNull , @Max 等, 不需要做任何其他操作.

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

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

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

自定義驗證邏輯

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

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

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

為什麽不建議使用 String.split()

? 因為其使用了正則, 其次容易出異常. 建議使用三方封裝. 可以使用StringUtils.delimitedListToStringArray() 或 commons-lang3包的 StringUtils 或使用 JDK 的 StringTokenizer.

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

  2. 通過定義類似 String message() default "{javax.validation.constraints.DecimalMax.message}"; 可以實現國際化.

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