目录
1 前言
在使用注解进行参数校验的时候,依赖中包含注解如@NotNull、@NotEmpty等已满足我们大部分的需求,不过仍然有时候需要我们自定义注解进行校验。
举个例子,前端传送过来一个json格式的数据,我们需要用一个实体类来接收,其中有个属性为String类型,且只能为"管理员"或者"用户",如下:
public class User {
private String identity;//身份,只能为管理员或用户
//其它...
}
这时候就需要我们自定义参数校验,以这个为例,接下来来介绍实现方法。
2 实现方法
2.1 自定义注解
2.1.1 学习已有的注解
我们可以先打开一个已有的注解进行观摩学习,如@NotEmpty,主要内容和解读如下:
//其它...
//用于标识该注解是可以抽取到帮助文档中的
@Documented
//指定了该注解可以用于方法、字段(属性)、注解类型、构造函数、参数和类型使用的地方。
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
//指定该注解可以保留到什么阶段,如编译阶段、运行阶段,这里是运行阶段
@Retention(RetentionPolicy.RUNTIME)
//指定谁给注解提供校验规则
@Constraint(validatedBy = {})
public @interface NotEmpty {
//提供校验失败后的提示信息
String message() default "{jakarta.validation.constraints.NotEmpty.message}";
//指定分组
Class<?>[] groups() default {};
// 负载,用于获取注解的附加信息,一般用不着,但是必须提供
Class<? extends Payload>[] payload() default {};
//其它代码...
}
2.1.2 照葫芦画瓢得到自己的注解
@Documented
@Target(ElementType.FIELD)//仅用于属性上,多个需要{}括起
@Retention(RetentionPolicy.RUNTIME)//保留到运行时
@Constraint(validatedBy = {})//待定,等编写校验规则类后提供
public @interface Identity {
String message() default "identity参数只能为管理员或者用户";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2.2 自定义提供校验规则的类
public class IdentityValidation implements ConstraintValidator<Identity, String> {
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if (s == null) {
return false;
}
if (s.equals("管理员") || s.equals("用户")) {
return true;
}
return false;
}
}
自定义提供规则的类需要实现 ConstraintValidator<Identity, String>,第一个为我们的注解,第二个为需要管理的参数类型。然后需要重写isValid方法,符合校验条件返回true,否则返回false。
然后别忘了给@Constraint(validatedBy = {})指定,如下:
//其它
@Constraint(validatedBy = IdentityValidation.class)
public @interface Identity {
//其它
}
2.3 在需要的地方使用自定义的类
public class User {
@Identity
private String identity;//身份,只能为管理员或用户
//其它...
}