问题描述
当要对用户输入的参数进行校验时,可以用javax.validation.Validation包下的注解进行验证,实现简单,并且是基于JSR-303标准的。
添加pom.xml依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Controller中为要验证的POJO添加@Valid注解
@RequestMapping("/login")
@ResponseBody
//使用@Valid注解进行参数校验,减少代码冗余度
public String login(@Valid LoginVo loginVo) {
}
在POJO类中添加注解
public class LoginVo {
@NotNull // 不允许为空
@isEmail //自定义注解
private String Email;
@NotNull
@Length(min = 32)//长度限制,最短为32位
private String password;
}
原生的主要注解说明
自定义注解
- 设计注解
//参照javax.validation.constraints包下的NotNull注解进行自定义自己的注解,添加以下四个注解
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {isEmailValidator.class})// 通过Constraint注解器中的validatedBy参数,调用相应的类进行规则判定
public @interface isEmail {
String message() default "email 格式错误"; //对email进行验证,验证不通过时返回的消息
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
//参照javax.validation.constraints;包下的NotNull注解进行自定义自己的注解,以上三个函数是必须的
// 自定义一个函数,设置是否允许参数为空
boolean notNull() default true; //默认设置为不允许为空
}
- 设计规则判定的校验类
//规则判定的校验类需要实现ConstraintValidator接口,并实现其中的方法。<isEmail, String>对应于特定的注解和用户输入的字段类型
public class isEmailValidator implements ConstraintValidator<isEmail, String> {
private boolean notNull = false;
@Override
public void initialize(isEmail constraintAnnotation) {
//初始化这个方法可以取到isEmail这个注解以及其中的内容
notNull = constraintAnnotation.notNull();//将注解器中的内容取出
}
// value为用户输入的内容,通过这个方法进行对value校验是否合法
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//不允许为空
if (notNull) {
return isEmail(value);
} else {//允许为空
if (value == null) {
return true;
} else {
return isEmail(value);
}
}
}
// 进行email匹配,使用正则表达式匹配
public static final Pattern email_pattern = Pattern.compile("^[A-Za-z\\d]+([-_.][A-Za-z\\d]+)*@([A-Za-z\\d]+[-.])+[A-Za-z\\d]{2,4}$");
public static boolean isEmail(String email) {
if (email == null) {
return false;
}
Matcher matcher = email_pattern.matcher(email);
return matcher.matches();
}
}