前言
像日常我们可能会进行一些枚举定义。一些状态的定义。这个时候你就需要去写一些。校验的方法和参数今天在小节,主要是讲如何自定义注解。来进行一个参数校验,非常的简单方便。
自定义注解
首先我们自定义一个圆类型的注解。标注这个注解的使用范围。然后什么时候去使用都是些常用的配置。
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) {
}
回顾
最后的话,我想说有的时候都去看看源码,学习别人的注解的实现方式。对实现一些校验的功能还是非常优雅的,自己实现一些注解可以使代码变得非常的简洁。