spring中的hibernate-validate数据校验
两种方式
第一种,bean级别校验
1.直接在实体类使用注解校验
首先在项目里引入jar包
<!--hibernate validate PO校验-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!--end-->
2.spring中注册bean
<!--hibernate validate校验数据-->
<!-- bean级别的校验 方法中的参数bean必须添加@Valid注解,后面紧跟着BindingResult result参数-->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
</bean>
3.实体类 注解校
//学号
private Integer sno;
// @NotNull 和 @NotEmpty 和@NotBlank 区别
//
//@NotEmpty 用在集合类上面
//@NotBlank 用在String上面
//@NotNull 用在基本类型上
// @NotBlank(message = "学生姓名是必填项")
// @Length(max = 10, min = 6,message = "6-10")
@Size(min = 2,max = 20,message = "用户名的长度必须在{min}-{max}之间")
private String sname;
@Pattern(regexp = "^1[3|5|7|8|9]\\d{9}$",message = "手机号码格式不正确")
//@Phone
private String phone;
// @NotNull(message = "班级为必填项")
// @Max(value = 30, message = "班级区段在1-30")
// @Min(value = 1, message = "班级区段在1-30")
@Range(min = 1, max = 2,message="班级只能填入1-2位数字")
private Integer bandNo;
private Integer sex; // 1 表示男 0表示女
@Email(message = "请填入正确的邮箱地址")
private String mailBox;
@Max(value = 30, message = "年龄最大为30岁")
@Min(value = 6, message = "年龄最小为6岁")
private Integer age;
4.如何在方法中使用
/**
* bean 级别hibernate-validate校验
* @param student 前台传入参数
* @param result hibernate-validate错误信息
* @return json格式数据用于前台执行
*/
@RequestMapping("/add")
@ResponseBody
public ReturnInfo add(@RequestBody @Valid Student student, BindingResult result){
ReturnInfo returnInfo = null;
StringBuilder stringBuilder = new StringBuilder();
if(result.hasErrors()){
Iterator it = result.getAllErrors().iterator();
while(it.hasNext()){
ObjectError error = (ObjectError)it.next();
stringBuilder.append(error.getDefaultMessage());
}
returnInfo = new ReturnInfo(3,stringBuilder.toString(),false);
}else{
returnInfo = studentService.addStudent(student);
}
logger.info(returnInfo.getMessage());
return returnInfo;
}
第二种,自定义校验
1.校验接口
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneValidate.class)//实现校验的方法
public @interface Phone {
String value() default "1885091"; //默认值
String message() default "电话号码格式有错";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2.实现校验方法
//它一共需要指定两种类型,第一个类型是对应的initialize方法的参数类型,第二个类型是对应的isValid方法的第一个参数类型。
public class PhoneValidate implements ConstraintValidator<Phone,String> {
private String phone = "^1[3|5|7|8|9]\\d{9}$";
private String value ;
@Override
public void initialize(Phone constraintAnnotation) {
value = constraintAnnotation.value();//可以获取指定的值
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if(s == null){
return true;
}
return s.matches(phone);
}
}
3.在实体类中配置注解
@Phone
private String phone;
4.把实现方法直接写成内部类
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = Email.EmailValidate.class)
public @interface Email {
boolean allowBlank() default false;
String message() default "邮箱不许为空";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
class EmailValidate implements ConstraintValidator<Email,String>{
private boolean flag;
@Override
public void initialize(Email constraintAnnotation) {
flag = constraintAnnotation.allowBlank();
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if(!flag){
if(s == null || "".equals(s)){
return false;
}
}
return true;
}
}
}
最后推荐一篇hibernate-validate 的精讲
https://blog.csdn.net/u012706811/article/details/51079740