前言

像日常我们可能会进行一些枚举定义。一些状态的定义。这个时候你就需要去写一些。校验的方法和参数今天在小节,主要是讲如何自定义注解。来进行一个参数校验,非常的简单方便。

自定义注解

首先我们自定义一个圆类型的注解。标注这个注解的使用范围。然后什么时候去使用都是些常用的配置。

import com.*.sim.validator.LanguageValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 语言类型验证注解
 * @author stevenchen
 */
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = LanguageValidator.class)
public @interface Language {

    String message() default "语言类型错误";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

验证逻辑

紧接着我们去编写这个注解调用的一些实现方法,初始化方法,还有一些校验方法。首先我们需要去继承相应的校验的一个公共的接口类。配置好相应的发型参数。接着只需要重写它的初始化方法,还有一些验证的方法就可以了,剩下的就我们这些需要编写一些类似的逻辑。

/**
 * 编译语言校验
 * @author Steven
 * @Date 2021/12/31 11:26
 */
public class LanguageValidator implements ConstraintValidator<Language, String> {

    @Override
    public void initialize(Language constraintAnnotation) {
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return LanguageEnum.isExist(value);
    }
}

配置到属性上面

就同样的,我们只需要在属性或者方法上面去加上这个注解。只需要加上这个注解就ok了,其他的你任何都不需要做。当我们去请求的时候,它自动会去校验这个方法里面的一些参数,如果你有兴趣的话,你也可以去看一下像这个非空的一个注解,它的实现逻辑基本上类似的,有些时候多看一下源码的话,这里是重写它的一些方法,非常的有帮助,因为它提供的注解可能不能适用所有的场景。

/**
     * @see LanguageEnum
     */
    @ApiModelProperty(value = "请求语言类型小写,目前python|c++", required = true, example = "python")
    @NotBlank(message = "语言类型,不能为空")
    @Language
    private String language;

应用到接口

然后就是接口部分的实现结果的话,你只需要去加上对应的一些validate注解。他就会去校验相应的一些属性。这里使用的是一个表单提醒的方式,当然你也可以使用。Json的方式,但是前提一定要加一个validate注解。

@PostMapping(value= "/run", consumes = { MediaType.MULTIPART_FORM_DATA_VALUE })
    public CommonResult<BacktestResultVo> run(HttpServletRequest request,
                                              @Validated @ModelAttribute BuildCodeDto buildCodeDto) {
    }

回顾

最后的话,我想说有的时候都去看看源码,学习别人的注解的实现方式。对实现一些校验的功能还是非常优雅的,自己实现一些注解可以使代码变得非常的简洁。

最后