這節沒有高深的東西, 但有一些學習思路值得借鑑.java
JSR 303 (Bean Validation)spring
<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()>1000
code
斷言耦合了業務邏輯. 避免耦合能夠使用
HandlerIntercepter
或者Filter
作攔截. 也能夠使用 AOP 切面來完成. 但上述均不是統一的標準實現.xml
參考 Spring 已經實現的其餘驗證邏輯.ci
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Documented @Constraint(validatedBy = { }) public @interface Card {
理解註解上的 @Constraint
,get
實現 public interface ConstraintValidator<A extends Annotation, T>
it
爲何不建議使用
String.split()
? 由於其使用了正則, 其次容易出異常. 建議使用三方封裝. 能夠使用StringUtils.delimitedListToStringArray()
或 commons-lang3包的StringUtils
或使用 JDK 的StringTokenizer
.
註解 Card
上修改 @Constraint(validatedBy = { CardValidation })
指定驗證的類.
經過定義相似 String message() default "{javax.validation.constraints.DecimalMax.message}";
能夠實現國際化.