Spring Boot系列(四) Spring Boot 之驗證
阿新 • • 發佈:2019-05-07
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 已經實現的其他驗證邏輯.
- 定義註解
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { })
public @interface Card {
理解註解上的
@Constraint
,實現
public interface ConstraintValidator<A extends Annotation, T>
為什麽不建議使用
String.split()
? 因為其使用了正則, 其次容易出異常. 建議使用三方封裝. 可以使用StringUtils.delimitedListToStringArray()
或 commons-lang3包的StringUtils
或使用 JDK 的StringTokenizer
.
註解
Card
上修改@Constraint(validatedBy = { CardValidation })
指定驗證的類.通過定義類似
String message() default "{javax.validation.constraints.DecimalMax.message}";
可以實現國際化.
Spring Boot系列(四) Spring Boot 之驗證