前言
在开发过程在我们往往会遇到很多的开发阻碍或者因为原生框架的不支持导致的一系列问题或者有的不是问题,是我们使用普通的大量的复制粘贴改改就能用的代码去实现功能,这样使得代码很冗余,我们能不能去尝试找一些好的方案比如采用设计模式这些去优化我们的代码,实现代码简洁明了,易扩展呢?答案是肯定的。这个系列文章会使用案列加解决方案的形式为大家讲解,那下面我们开始吧。
- 主题:解决Spring Boot里的表单字段重复性校验的问题
- 问题阐释:重复性校验体现在哪里?大量的重复代码
- 案例:不论是在Spring还是Spring Boot的使用中我们后端开发人员都会遇到表单校验的问题,有人说前端做了校验后端就不用做了,别!不是不相信队友,后端也做校验的话会少很多问题,相信很多后端小伙伴都深有体会。回到正题上,字段校验的话,字段少的话,就是Controller里一堆if判断,功能当然实现了但是呢代码看着很乱,各种判断,后期也不好维护。当然后面也免不了被接手项目的人喷代码像翔一样。所以呢,写代码用点心,可以不被喷。
- 说到校验很多小伙伴找到的都是使用Validation来校验参数,没错,使用Validation自带一些注解的确能解决很多常规的问题,比如下图这些:
另外经验丰富的小伙伴很多都喜欢用正则表达式,所以@Pattern注解就很受欢迎了,比如身份证校验的,15位或者18位,用代码去取数组判断就很麻烦,用正则表达式呢,@Pattern(regexp="(^\d{15})|(^\d{18})∣(\d18)|(^\d{17}(\d|X|x)$)",message="身份证格式不正确!"),这样就可以了,是不是很方便,那正则表达式也不能实现的呢,那就使用自定义注解吧,下面以身份证校验为例子。
1.实现注解方法,注意下面的几个注解元
@Target({ElementType.METHOD,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) //加载校验的类 @Constraint(validatedBy = IdCardNoValidator.class) public @interface IdCardNoConstraint { String message() ; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; } 复制代码
2.校验规则,具体的校验,返回true/false,false则触发错误提示即message
public class IdCardNoValidator implements ConstraintValidator<IdCardNoConstraint, Object> { @Override public void initialize(IdCardNoConstraint constraintAnnotation) { } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { String regex="/^[1-8][1-7]\\d{4}(?:19|20)\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{3}[\\dX]$/\n" + "\n"; return Pattern.matches(value.toString(),regex); } 复制代码
3.自定义注解的使用
@IdCardNoConstraint(message="身份证格式不正确,请输入正确的身份证!") private String idCardNo; 复制代码
以上三步就完成了一个自定义注解的编写,如果项目中出现大量的同类似校验,写这个一个比写一堆if-else好多了。
小结
今天的问题及解决方案就讲到这里,我们明天继续。fighting......