/*
没有加分组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.既想要校验默认分组字段又想要校验自定义分组字段,那么把要校验的字段的分组都加上:
标签:Default,校验,默认,javax,分组,AddGroup,validation,class From: https://www.cnblogs.com/liftsail/p/18224396