javax.validation分组校验

    /*
        没有加分组groups的属于Default默认分组。
        添加分组groups的属于自定义分组,不属于默认分组。
        validation校验默认使用默认分组校验,不会校验自定义分组。
        因此如果需要校验自定义分组的字段,需要校验的时候加上自定义分组,如:
        ValidationUtil.validate(userEntity, Default.class, Group.AddGroup.class);
        或者在controller方法体加上@RequestBody @Validated({Default.class, Group.AddGroup.class}) UserEntity userEntity, BindingResult bindingResult
     */
在用户注册的时候或者登录的时候,我需要用户名和密码都进行非空校验。但是我在对用户进行分组的时候,我有一个分组实体,里面有分组名称和List<UserEntity>。
那么我在保存的时候,我会保存一个group和user的关系表,里面存分组id和userName。
这时候我在保存关系的时候,我只需要对用户名进行非空校验,而不需要对密码进行非空校验。这时候该怎么办呢?再定义一个user实体password不加注解校验?或者单独程序校验而不用注解校验?
其实javax.validation已经为我们考虑好了,不用那么麻烦。只需要对要校验的字段进行分组即可。
javax.validation分组校验:
注意:
没有加分组groups的属于Default默认分组。
添加分组groups的属于自定义分组,不属于默认分组。
validation校验默认使用默认分组校验,不会校验自定义分组。
因此如果需要校验自定义分组的字段,需要校验的时候加上分组,如:
ValidationUtil.validate(userEntity, Default.class, Group.AddGroup.class);
或者在controller方法入参加上@RequestBody @Validated({Default.class, Group.AddGroup.class}) UserEntity userEntity, BindingResult bindingResult
不想要校验某个分组的字段,把某个分组给去掉就好了。
package com.springbootvalidation.common;

/**
 * 验证分组
 */
public class Group {
    public interface AddGroup{}
}
package com.springbootvalidation.utils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.xml.bind.ValidationException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
* @description: 校验工具类
*/
public class ValidationUtil {
    private static Validator validator;

    static {
       ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
       validator = vf.getValidator();
    }
    /**
      * javax.validation注解校验
      * @throws ValidationException
      * @throws ValidationException
      * @Description: 校验方法
      * @param t 将要校验的对象
      * @throws ValidationException
      * void
      * @throws
     */
    public static <T> List<String> validate(T t){
        return validate(t,null);
    }

    public static <T> List<String> validate(T t, Class<?>... groups){
        Set<ConstraintViolation<T>> set;
        if(groups != null && groups.length > 0){
            set = validator.validate(t,groups);
        }else{
            set = validator.validate(t);
        }
        List<String> validateError = new ArrayList<>();
        if(set.size()>0){
            for(ConstraintViolation<T> val : set){
                validateError.add(val.getMessage());
            }
        }
        return validateError;
    }
}

 javax.validation默认是Default默认分组。上面@Validated({Default.class})表示默认分组,也可以只用@Validated或者@Valid表示,去掉({Default.class}),这样效果等同于@Validated({Default.class})表示只是用默认分组校验。

默认分组校验不会校验AddGroup分组的字段。即不会校验userName字段不能为空。

这样的话如果其他地方用到此实体,而不想要校验userName,那么只用默认分组校验就可以了。因为默认分组校验只会校验默认分组的字段(即不加任何分组的字段),不会校验自定义分组的字段(如:加了groups = Group.AddGroup.class)。

总结:

那些不管在哪儿使用都要校验的字段,我们用默认分组(不加任何分组)即可。如果有些字段在这里需要校验,而在其他地方不需要校验,那么把这些字段加上分组即可,

如果要校验自定义分组的字段,只需要在校验的时候加上Group.AddGroup.class即可。

只校验默认分组的字段:只需要Default.class。

只校验自定义分组的字段:只需要Group.AddGroup.class。

需要校验默认分组又需要校验自定义分组的字段:加上Default.class,Group.AddGroup.class。

分组的作用就是区分有些字段我需要校验,而有些字段我不需要校验,那么我校验的时候选择要校验的分组即可,不校验的字段的分组不选择。

校验字段的方式有两种:

方式1:在controller的方法入参中加上@Validated({Default.class, Group.AddGroup.class})和BindingResult bindingResult。

方式2:用ValidationUtil工具类校验,ValidationUtil工具类的校验使得校验不局限在controller的方法入参中。想在任何时候,任何地方校验,就在哪里添加工具类的校验。

1.只想要校验Default默认分组(不加任何分组的字段,@NotBlank(message = "密码不能为空!")):

 2.只想要校验AddGroup的字段(@NotBlank(message = "用户名不能为空!",groups = Group.AddGroup.class),带groups的):

3.既想要校验默认分组字段又想要校验自定义分组字段,那么把要校验的字段的分组都加上:

posted @ 2024-05-31 13:45  liftsail  阅读(76)  评论(0编辑  收藏  举报