validation主要就是对数据的一些校验,比如id不能为空,最大/最小值的校验.先做一个简单的hello world 的demo
1.引包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2. 在controller的接口参数列表中加上@Valid注解,然后再参数后面加上BinidiingResult,@Valid 和 BindingResult 是一一对应的,如果有多个@Valid,那么每个@Valid后面跟着的BindingResult就是这个@Valid的验证结果,顺序不能乱
@RequestMapping("addEmp")
@ResponseBody
public String addEmp(@Valid Employee employee, BindingResult bindingResult) {
if (bindingResult.hasErrors()){
StringBuilder stringBuilder = new StringBuilder();
bindingResult.getAllErrors().forEach(objectError -> stringBuilder.append(objectError.getDefaultMessage()).append(";"));
return WebUtil.getFailureJson(stringBuilder.toString());
}
return WebUtil.getSuccessJson(employeeService.addEmployee(employee));
}
这里的webUtil是我封装的返回jsonString的工具类,如果你们没有,就直接创建一个jsonObject.然后 jsonObject.put("message",stringBuilder.toString)这样返回也是json string.
3.在实体类上加上注解
package com.alimama.api.model;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
public class Employee implements Serializable {
/**
* 主键
*/
@NotNull(message = "用户主键不能为空!")
private Long id;
/**
* 名字
*/
@NotNull(message = "用户姓名不能为空!")
private String lastName;
/**
* 性别 0:女 1:男
*/
@NotNull(message = "用户性别不能为空!")
private Byte gender;
/**
* 邮箱
*/
private String email;
/**
* 部门id
*/
private Long departmentId;
/**
* 部门名称
*/
private String departmentName;
/**
* 生日
*/
private Date birth;
/**
* 密码
*/
private String password;
/**
* 盐
*/
private String salt;
}
4.测试
简单使用,下面有更多的注解,需要的自取.也是用的别的博客的注解图
二:然后有时候我们需要自己定义需要校验的问题,那么我们需要自己写相关逻辑,自己定义注解
1.定义注解,再写注解校验实现,最后在我们需要校验的字段加上注解,测试
package com.alimama.api.validations;
/**
* Created by PengWX on 2020/4/23.
*/
//参照javax.validation.constraints包下的NotNull注解进行自定义自己的注解,添加以下四个注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {IsEmailValidator.class})// 通过Constraint注解器中的validatedBy参数,调用相应的类进行规则判定
public @interface EmailValidation {
String message() default "email 格式错误"; //对email进行验证,验证不通过时返回的消息
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
//参照javax.validation.constraints;包下的NotNull注解进行自定义自己的注解,以上三个函数是必须的
// 自定义一个函数,设置是否允许参数为空
boolean notNull() default true; //默认设置为不允许为空
}
package com.alimama.api.validations;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by PengWX on 2020/4/23.
*/
public class IsEmailValidator implements ConstraintValidator<EmailValidation, String> {
private boolean notNull = false;
@Override
public void initialize(EmailValidation constraintAnnotation) {
//初始化这个方法可以取到EmailValidation这个注解以及其中的内容
notNull = constraintAnnotation.notNull();//将注解器中的内容取出
}
// value为用户输入的内容,实现ConstraintValidator的这个方法,通过这个方法进行对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();
}
}
/**
* 密码
*/
@NotNull(message = "邮编不能为空!")
@EmailValidation(message = "会不会填邮编啊")
private String password;
测试