目录
引言:
一.为什么我们需要做入参的校验
二.通过自定义annotation的方式来实现
2.1 编写注解类
2.2 编写实现类
2.3 入参类或入参对象上加上指定注解
2.3.1 入参类
2.3.2 入参对象
2.4 controller入参类或对象上加上指定注解
三.意义
引言:
前一段时间太忙了,一直没时间来写博客,刚忙完了,这次给大家分享一个我们日常开发工作中经常会用到的东西吧,干货满满。欢迎评论哦!
一.为什么我们需要做入参的校验
入参的校验,我相信我们在日常的开发工作中会经常的碰到。入参的校验肯定是非常有必要的。
1.可以保证了我们数据的完整性和安全性
2.保证了我们数据库的干净,尽量不保存脏的数据。
3.保证了我们业务的合理性,让所有不合理的入参抹杀在摇篮里面
好了我们上述说明了入参的必要性,接下来那我们该如何来做入参的校验呢。其实有很多中方式,之前看到过很多不好的实践,将参数的校验全部写在了service层,导致我们的service层非常的臃肿和不好管理。那么接下里我要跟大家介绍的就是通过在controller层加annotation的方式来校验入参。好了,非要不多说,开始show代码吧。
二.通过自定义annotation的方式来实现
2.1 编写注解类
给大家举一个以下的例子,这个注解的作用是通过给指定字段加注解的方式判断这个字段的值的长度是否在指定的长度范围之内。
@Constraint(validatedBy = SizeValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RUNTIME)
@Documented
public @interface RichTextSize {
String message() default "Size must be valid";
/**
* @return size the element must be higher or equal to
*/
int min() default 0;
/**
* @return size the element must be lower or equal to
*/
int max() default Integer.MAX_VALUE;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Constraint(validatedBy = SizeValidator.class):这个注解的意思是指定实现逻辑的类
2.2 编写实现类
public class SizeValidator implements ConstraintValidator<RichTextSize, String> {
private Integer max = Integer.MAX_VALUE;
private Integer min = 0;
@Override
public void initialize(RichTextSize richTextSizeAnnotation) {
min = richTextSizeAnnotation.min();
max = richTextSizeAnnotation.max();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
Boolean maxType = maxValid(value);
Boolean minType = minValid(value);
return maxType && minType;
}
private Boolean maxValid(String value){
int stringLength = 0;
if(Objects.nonNull(value)) {
stringLength = Jsoup.parse(value).text().length();
}
return stringLength <= max;
}
private Boolean minValid(String value){
int stringLength = 0;
if(Objects.nonNull(value)){
stringLength = Jsoup.parse(value).text().length();
}
return stringLength >= min;
}
}
这段代码的意思是,需要制定具体的注解类,后面的String的意思是被此注解加上的字段的类型,我们这边目前加在string类型上的所以是string,如果是加在Integer类行上的那这里就是Integer
2.3 入参类或入参对象上加上指定注解
2.3.1 入参类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TestDTO {
@RichTextSize(min = 1,max = 2000,message = "长度必须大于1小于2000")
private String testValue;
}
2.3.2 入参对象
@GetMapping("/test1")
public void test1(@Valid @RichTextSize String testValue){
log.info("test");
}
2.4 controller入参类或对象上加上指定注解
必须要在验证的入参前面加上@Valid注解,不加的话会失效。
三.意义
我想大家肯定或多或少有一些疑问,觉得在service层也能实现的,为什么需要另外在写一个anntation来实现呢,觉得没有必要。其实通过anntation来实现的话,有几点好处是service层写没有的:
1.可以帮助我们解耦业务代码和验证逻辑代码,更加有助于我们以后的维护工作。
2.可以聚合散落在各个地方的类似逻辑的代码。让同一种逻辑的代码放在一个地方,便于日后的维护。