前言
进行SpringMVC开发的同学,肯定会使用校验,来保证输入参数的合法性,这就后端校验
。如下所示,对于普通的校验,hibernate
大多数可以满足我们的需求,但如果遇到不满足的,我们可以自定义,比如:手机号校验
。
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency>
当引入校验框架之后,看看下面的例子,你是否回想起曾经也写过类似的代码。
@Data
public class Teacher {
@NotBlack // 普通注解,可以划分组
private String name;
@Valid // 此注解可以对 Student对象中加注解的属性进行加校验
private List<Student> students;
}
public class TeacherController {
// 通过 @Validated 可以对当前handleMethod的参数进行校验,此处可以使用分组校验
public Teacher getInfo(@Validated Teacher teacher) {
}
}
那么,针对于特殊的字段,需要进行特殊的校验时,我们就需要自定义校验
,下面就来详细介绍如何自定义校验。
第一步:自定义校验注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD})
// 指定 校验注解器
@Constraint(validatedBy = NameValidatorClass.class)
public @interface Name {
// value值,可以接收注解中value值
String value() default "";
// 校验失败,提示信息
String message() default "username is not null";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
如果注解中的属性字段没有default
默认值,那么就是注解中必填字段
。自定义校验注解需要绑定校验注解器
。
第二步:自定义校验注解器
public class NameValidatorClass implements ConstraintValidator<Name, String> {
private String value;
/**
* 将注解中的值进行初始化
* @param name 自定义注解
* @return void
**/
@Override
public void initialize(Name name) {
// 获取自定义注解中的属性值
this.value = name.value();
}
/**
* 将传进来的值进行校验
* @param value 提交需要被校验的值
* @param context 上下文环境
* @return true表示校验通过,false表示校验失败,抛出异常信息message
**/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return !"".equals(value);
}
}
第三步:使用自定义注解
@Data
public class User {
@Name(groups = {Add.class})
private String name;
}
@PostMapping("/hello")
public R addUser(@Validated({Add.class}) User user) {
return R.ok();
}
总结
因为校验失败会抛出异常,又因为SpringMVC推荐全局统一异常处理,所以我们只需要全局异常处理器
来捕获校验失败异常,将异常结果以JSON格式返回给前端。