Hibernate Validator 提供了"根据对象状态动态重定义默认分组"的接口。
什么意思呢?考虑下面这个场景:假如一个bean有3个属性,分别是attrA, attrB和attrC。当attrA属性的值是value1,我们需要对attrB进行校验;当attrA属性的值是value2的时候,我们需要对attrC进行校验。
为了实现上面这个目的,我们需要实现DefaultGroupSequenceProvider
接口,并且在被校验的bean上使用@GroupSequenceProvider
来应用我们的实现。
- 自定义分组序列提供器
public class SomeFormGroupSequenceProvider implements DefaultGroupSequenceProvider<SomeForm> {
@Override
public List<Class<?>> getValidationGroups(SomeForm someForm) {
List<Class<?>> defaultGroupSequence = new ArrayList<>();
defaultGroupSequence.add(SomeForm.class);
if (someForm != null && someForm.getType() == 1) {
defaultGroupSequence.add(SomeForm.WhenTypeEqualsOne.class);
}
if (someForm != null && someForm.getType() == 2) {
defaultGroupSequence.add(SomeForm.WhenTypeEqualsTwo.class);
}
return defaultGroupSequence;
}
}
- 待校验的bean
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
@GroupSequenceProvider(value = SomeFormGroupSequenceProvider.class)
public class SomeForm {
private Integer type;
@NotBlank
@Size(min = 1, max = 3, groups = WhenTypeEqualsOne.class)
private String whenTypeEqualsOne;
@NotBlank
@Size(min = 4, max = 6, groups = WhenTypeEqualsTwo.class)
private String whenTypeEqualsTwo;
interface WhenTypeEqualsOne {
}
interface WhenTypeEqualsTwo {
}
}
- 测试
@Test
public void groupValidateFifthTestVerTwo() {
SomeForm formWithTypeEqualsOne = new SomeForm(1, "hello", "a");
System.out.println("-------- formWithTypeEqualsOne -------- \n"
+ validator.validate(formWithTypeEqualsOne) + "\n");
SomeForm formWithTypeEqualsTwo = new SomeForm(2, "hello", "a");
System.out.println("-------- formWithTypeEqualsTwo -------- \n"
+ validator.validate(formWithTypeEqualsTwo) + "\n");
}
- 查看
-------- formWithTypeEqualsOne --------
[ConstraintViolationImpl{interpolatedMessage='个数必须在1和3之间', propertyPath=whenTypeEqualsOne, rootBeanClass=class com.qs.mmeng.hibernate.validator.group.five.ver2.SomeForm, messageTemplate='{javax.validation.constraints.Size.message}'}]
-------- formWithTypeEqualsTwo --------
[ConstraintViolationImpl{interpolatedMessage='个数必须在4和6之间', propertyPath=whenTypeEqualsTwo, rootBeanClass=class com.qs.mmeng.hibernate.validator.group.five.ver2.SomeForm, messageTemplate='{javax.validation.constraints.Size.message}'}]