springboot 之前端参数验证
学习完简单的验证之后发现基本能满足百分之 80 的验证需求,接下来深入学习下验证。
分组验证
分组验证需要使用到 @Validated 这个注解,是 spring 基于 @Valid 注解新增的功能。所以基本上在 controller 层接收参数的时候,可以用 @Validated 注解替换 @Valid。不过 @Validated 注解不能放在类中的字段上面,而 @Valid 注解可以放在类中的字段上面。所以如果类中的某个字段不是基础类型,但是里面的参数需要校验的话,需要在字段上面加上 @Valid 代码如下:
/** * @author 海加尔金鹰 */ @Data public class TestVo { @NotBlank(message = "name 不能为空字符串") private String name; @Valid private List<TestVo> testVos; //验证集合里面的TestVo ,不加上无法进行验证
分组验证:例如同一个参数,在新增的时候,id 不传 但是在修改的时候必传。这个时候可以利用 group 来指定验证的规则组
创建两个不同的验证组: 关于是否继承默认验证组,建议都继承,如果不继承,在验证的时候只会验证指定的字段
/** * @author 海加尔金鹰 * 新增验证组 */ public interface Insert { }
/** * @author 海加尔金鹰 *更新验证组 */ public interface Update extends Default { }
设置实体的验证规则
@Data public class TestVo { @NotNull(message = "id 不能为空", groups = Update.class) @Null(message = "id必须为空", groups = Insert.class) private Integer id; @NotBlank(message = "name 不能为空字符串") private String name; }
在 controller 进行验证规则设置
@GetMapping("/id") public TestVo getTestVo(@RequestBody @Validated({Update.class}) TestVo vo, BindingResult bindingResult) { //@Validated({Update.class}) 表示只验证Update这个组。由于这个组继承了默认default组 name也可以被验证,如果是Insert 就无法验证。 //如果不配置{Update.class} 表示验证默认组的数据 return vo; }
最后发送请求进行验证即可。
自定义验证
当自己的验证规则比较奇特的时候,可以自定义验证
第一步: 创建自定义验证注解
/** * @author 海加尔金鹰 * 注意@Constraint(validatedBy = PhoneValidator.class) 这个注解 表明具体验证规则在PhoneValidator类里面 */ @Constraint(validatedBy = PhoneValidator.class) @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Phone { String message() default "手机号格式不合法"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
第二步创建具体验证 PhoneValidator 类
/** * @author 海加尔金鹰 * @date 2020/5/11 17:52 * @apiNote 手机号码验证 */ public class PhoneValidator implements ConstraintValidator<Phone,String> { private Pattern pattern = Pattern.compile("1(([38]\\d)|(5[^4&&\\d])|(4[579])|(7[0135678]))\\d{8}"); @Override public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { if(s!=null){ return pattern.matcher(s).matches(); } return true; } }
第三步:和其他的验证注解一样使用即可
@Phone private String phone;
总结:基本上到这里就能满足百分之九十五的验证需求。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于