文章目录
1、为什么要学习Hibernate-invalidator框架
在上述的情况下、Hibernate-invalidator就应运而生了
备注:Hibernate-invalidator这个框架跟 Hibernate并没有什么关系、是一个独立的框架
2、对象参数的校验
2.1、定义对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
@NotNull(message = "用户名不能为空")
@Length(min = 6,max = 10,message = "用户名长度不对")
private String userName;
@NotNull(message = "密码不能为空")
@Length(min = 6,max = 10,message = "密码的长度不对")
private String password;
}
2.2、定义controller
@RequestMapping("register")
public String register(@Valid User user, BindingResult result){
if(result.hasFieldErrors()){ //如果校验有错那么这里就返回的是true
//获取所有的校验错误的信息
List<FieldError> fieldErrors = result.getFieldErrors();
for (FieldError f:fieldErrors) {
//这里就可以知道是那个校验出错了
String fieldName = f.getField(); //校验出错的key的名字
String message = f.getDefaultMessage();
logger.info("校验出错的列是:"+fieldName+"----校验的提示信息是:"+message);
}
}
return "请求完成....";
}
正则事例
var reg=/^1[3,4,5,6,7,8][0-9]{9}$/
String reg1="1[3,4,5,6,7,8][0-9]{9}";
3、方法参数的校验
3.1、写配置文件支持单个参数的校验
/**
* 开启Hiberante-invalidator对方法单个参数校验的支持
* @return
*/
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor(){
return new MethodValidationPostProcessor();
}
3.2、在校验的类上添加如下的注解
@Validated
3.3、编写要校验的方法
/**
* 做单个数据的校验
* @param userName
* @param password
* @return
*/
@RequestMapping(value = "register1")
public String register1(@NotNull(message = "用户名不能为空") @Length(min = 6,max = 10,message = "用户名只能6-10位之间") @RequestParam("userName") String userName,
@NotNull(message = "密码不能为空") @Length(min = 6,max = 10,message = "密码只能6-10位之间") @RequestParam("password") String password){
return "请求完成....";
}
4、Hibernate-invalidator的校验模式
4.1、校验模式的问题
4.1.1、普通模式的校验
就是所有的字段都要校验、而且校验不通过的 都要返回这个校验错误的信息
4.1.2、快速校验模式
只要校验中一个没通过、后面的就不用校验了
下面就是配置校验模式
配置文件中
/**
* 配置校验的规则 是普通校验呢还是快速校验
* @return
*/
@Bean
public Validator validator(){
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
.addProperty("Hibernate.validator.fail_fast", "true") //true:表示的快速校验 false:普通的校验
.buildValidatorFactory();
return validatorFactory.getValidator();
}
5、分组校验(*)
5.1、创建分组(就空接口而已)
public interface Login {
}
public interface Register {
}
5.2、在方法上表明当前这个方法属于哪一个组
@RequestMapping("register")
public String register(@Validated(Register.class) User user, BindingResult result){
if(result.hasFieldErrors()){ //如果校验有错那么这里就返回的是true
//获取所有的校验错误的信息
List<FieldError> fieldErrors = result.getFieldErrors();
for (FieldError f:fieldErrors) {
//这里就可以知道是那个校验出错了
String fieldName = f.getField(); //校验出错的key的名字
String message = f.getDefaultMessage();
logger.info("校验出错的列是:"+fieldName+"----校验的提示信息是:"+message);
}
}
return "请求完成....";
}
/**
* 登陆这个方法
* @param user
* @param result
* @return
*/
@RequestMapping("login")
public String login(@Validated(Login.class) User user, BindingResult result){
if(result.hasFieldErrors()){ //如果校验有错那么这里就返回的是true
//获取所有的校验错误的信息
List<FieldError> fieldErrors = result.getFieldErrors();
for (FieldError f:fieldErrors) {
//这里就可以知道是那个校验出错了
String fieldName = f.getField(); //校验出错的key的名字
String message = f.getDefaultMessage();
logger.info("校验出错的列是:"+fieldName+"----校验的提示信息是:"+message);
}
}
return "请求完成....";
}
5.3、在对象上标明当前属性需要在哪些分组做校验
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
@NotNull(message = "用户名不能为空",groups = {Register.class, Login.class})
@Length(min = 6,max = 10,message = "用户名长度不对",groups = {Register.class, Login.class})
private String userName;
@NotNull(message = "密码不能为空",groups = {Register.class, Login.class})
@Length(min = 6,max = 10,message = "密码的长度不对",groups = {Register.class, Login.class})
private String password;
@NotNull(message = "密码不能为空",groups = {Register.class})
@Email(message = "不是邮箱地址",groups = {Register.class})
private String email; //邮箱
}
6、常见的注解
@Null 元素必须为null
@NotNull 元素不能为null
@AssertTrue 元素的值必须为true
@Assertfalse 元素必须为false
@Min | @DecimalMin :元素的值必须是一个数字 这个数字 的值必须大于等于最小值
@Max | @DecimalMax : 元素的值必须是一个数字 这个数字 的值必须小于等于最大值
@Size :表示的是元素的大小在指定的范围内
@Past :表示的是元素的值 必须是一个过期的时间
@Future:表示的是元素的值 必须在一个将来的时间
@Pattern(rex=xxx) :正则表达式判断的
@Notblack 字符串非null 长度必须大于0
@Email :邮箱判断
@length :长度判断
@NotEmpty :字符串非空
@Range :表示的是元素必须在指定的范围内
希望大家关注我一波,防止以后迷路,有需要的可以加我Q讨论互相学习java ,学习路线探讨,经验分享与java Q:2415773436