Bean Validation 中的 constraint
表 1. Bean Validation 中内置的 constraint
Constraint 详细信息 @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true @AssertFalse 被注释的元素必须为 false @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @Size(max, min) 被注释的元素的大小必须在指定的范围内 @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内 @Past 被注释的元素必须是一个过去的日期 @Future 被注释的元素必须是一个将来的日期 @Pattern(value) 被注释的元素必须符合指定的正则表达式 表 2. Hibernate Validator 附加的 constraint
Constraint 详细信息 被注释的元素必须是电子邮箱地址 @Length 被注释的字符串的大小必须在指定的范围内 @NotEmpty 被注释的字符串的必须非空 @Range 被注释的元素必须在合适的范围内
JSR-303是基于Bean的验证,那就是需要在Bean上加注解
代码如下:
/**
* 实体类
* @author 程就人生
*
*/
public class Test {
private String userUid;
//用户名不为空,使用默认提示
@NotNull
private String userName;
//密码进行长度和格式的验证,个性化提示
@Size(min=6, max=15,message="密码长度必须在 6 ~ 15 字符之间!")
@Pattern(regexp="^[a-zA-Z0-9|_]+$",message="密码必须由字母、数字、下划线组成!")
private String userPwd;
//手机号码也用个性化提示,使用正则表达式进行匹配,非空时不验证
@Pattern(regexp="^1(3|4|5|7|8)\\d{9}$",message="手机号码格式错误!")
private String userMobile;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date userBirthday;
}
说明:注解@Size是限定字段长度的,@Pattern是匹配正则表达式的,@DateTimeFormat是用来转换前台传递过来的日期,前台传递过来的日期必须是yyyy-MM-dd格式的字符串,后台才能正确接收,这几个参数都没有做非空验证,所以允许为null。
用mybatis从数据库查询出来的日期格式的数据是long型,如:1558504462000,想把它转换成年月日的形式,就用注解@JsonFormat,转换出来的时间总是少一天,后面加上timezone = "GMT+8"就可以了。
第二步,在Controller上绑定验证
/**
* 测试验证
*
*/
@RestController
public class ValidatorTestController {
/**
* 使用 @Validated 开启对象验证
* @param test
* @return
*/
@PostMapping("/validator")
public Object validatorObject(@Validated Test test, BindingResult br){
Map<String,Object> errorMap = new HashMap<String,Object>();
if(br.hasErrors()){
//对错误集合进行遍历,有的话,直接放入map集合中
br.getFieldErrors().forEach(p->{
errorMap.put(p.getField(), p.getDefaultMessage());
});
}
//返回错误信息
return errorMap;
}
}