自定义参数校验

目录

1 前言

2 实现方法

2.1 自定义注解

2.1.1 学习已有的注解

 2.1.2 照葫芦画瓢得到自己的注解

2.2 自定义提供校验规则的类

2.3 在需要的地方使用自定义的类


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[] 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[] payload() default {};
}

2.2 自定义提供校验规则的类

public class IdentityValidation implements ConstraintValidator {
    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if (s == null) {
            return false;
        }
        if (s.equals("管理员") || s.equals("用户")) {
            return true;
        }
        return false;
    }
}

自定义提供规则的类需要实现 ConstraintValidator,第一个为我们的注解,第二个为需要管理的参数类型。然后需要重写isValid方法,符合校验条件返回true,否则返回false。

然后别忘了给@Constraint(validatedBy = {})指定,如下:

//其它
@Constraint(validatedBy = IdentityValidation.class)
public @interface Identity {
    //其它
}

2.3 在需要的地方使用自定义的类

public class User {
    @Identity
    private String identity;//身份,只能为管理员或用户
    //其它...
}

你可能感兴趣的:(SpringBoot,spring,boot,自定义参数校验)