这节没有高深的东西, 但有一些学习思路值得借鉴.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}";
能够实现国际化.