这是目录
Hibernate Validator常用注解
注解 | 释义 |
---|---|
@NotNull | 不能为null |
@AssertTrue | 必须为true |
@AssertFalse | 必须为false |
@Min | 必须为数字,其值大于或等于指定的最小值 |
@Max | 必须为数字,其值小于或等于指定的最大值 |
@DecimalMin | 必须为数字,其值大于或等于指定的最小值 |
@DecimalMax | 必须为数字,其值小于或等于指定的最大值 |
@Size | 集合的长度 |
@Digits | 必须为数字,其值必须再可接受的范围内 |
@Past | 必须是过去的日期 |
@Future | 必须是将来的日期 |
@Pattern | 必须符合正则表达式 |
必须是邮箱格式 | |
@Length | 长度范围 |
@NotEmpty | 不能为null,长度大于0 |
@Range | 元素的大小范围 |
@NotBlank | 不能为null,字符串长度大于0(限字符串) |
添加依赖:(本人使用的是 gradle ,如果使用Maven 自行转换)
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version:'2.0.9.RELEASE'
或者
compile group: 'org.springframework.boot', name: 'spring-boot-starter-validation', version:'1.4.0.RELEASE'
1 注解方式参数校验
@GetMapping("/insert")
@ResponseBody
public User addUser(@Valid User user, BindingResult result) {
if (result.hasErrors()) {
for (ObjectError error : result.getAllErrors()) {
System.err.println(error.getDefaultMessage());
}
}
return user;
}
2 手动触发校验
- 校验工具类
import java.util.Iterator;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import org.hibernate.validator.HibernateValidator;
public class ValidatorUtils {
private static Validator validatorFast = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();
private static Validator validatorAll = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory().getValidator();
/**
* 校验遇到第一个不合法的字段直接返回不合法字段,后续字段不再校验
* @Time 2020年6月22日 上午11:36:13
* @param <T>
* @param domain
* @return
* @throws Exception
*/
public static <T> Set<ConstraintViolation<T>> validateFast(T domain) throws Exception {
Set<ConstraintViolation<T>> validateResult = validatorFast.validate(domain);
if(validateResult.size()>0) {
System.out.println(validateResult.iterator().next().getPropertyPath() +":"+ validateResult.iterator().next().getMessage());
}
return validateResult;
}
/**
* 校验所有字段并返回不合法字段
* @Time 2020年6月22日 上午11:36:55
* @param <T>
* @param domain
* @return
* @throws Exception
*/
public static <T> Set<ConstraintViolation<T>> validateAll(T domain) throws Exception {
Set<ConstraintViolation<T>> validateResult = validatorAll.validate(domain);
if(validateResult.size()>0) {
Iterator<ConstraintViolation<T>> it = validateResult.iterator();
while(it.hasNext()) {
ConstraintViolation<T> cv = it.next();
System.out.println(cv.getPropertyPath()+":"+cv.getMessage());
}
}
return validateResult;
}
}
- 业务代码
//校验数据合法性,合法则保存,不合法记录信息
Set<ConstraintViolation<User>> validateResult = ValidatorUtils.validateAll(user);
if(validateResult.size() > 0) {
rstMap.put("userName", userName);
rstMap.put("empId", empId);
rstMap.put("errorMsg", validateResult.iterator().next().getMessage());
rstList.add(rstMap);
continue;
}else {
userRepository.saveAndFlush(user);
}
- 实体
在字段上方添加注解即可
/**
* 登录账号
*/
@NotEmpty(message="登录账号不能为空")
@Length(min=0,max=50)
@Column(name = "USERNAME", nullable = false, length = 50)
private String userName;
打印出的结果(仅供参考,实际业务代码中,可以注释掉打印的代码)
userName: 登录账号不能为空
mgrType:不是一个合法的电子邮件地址
sysId: 校验失败,不能为空