Springboot之分组验证以及自定义参数验证

  |   0 评论   |   0 浏览

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;

总结:基本上到这里就能满足百分之九十五的验证需求。


标题:Springboot之分组验证以及自定义参数验证
作者:hjljy
地址:https://www.hjljy.cn/articles/2020/05/11/1589195443969.html