多个字段的联合约束-条件结果约束
1. 功能
- 实现了一个请求类中,两个字段:fieldA,fieldB。当fieldA == “22”时,fieldB值必须是“33”功能。
- fieldB的值是字符串数字,只要是数组中的一个值即可
- fieldA的值是一个字符串,作为条件,当fieldA满足条件时,才会比较fieldB
- 可以在一个类上添加多个注解,实现多个条件结果
2. 使用举例
@ConditionStringResultStringConstraint.List({
@ConditionStringResultStringConstraint(conditionName = "fieldA", resultName="fieldB", conditionValue = "22", resultValue = {"33"}),
@ConditionStringResultStringConstraint(conditionName = "fieldA", resultName="fieldB", conditionValue = "mm", resultValue = {"nn"})
})
public class DemoRequest {
private String fieldA;
private String fieldB;
getter
setter
}
- 当fieldA == “22”时,fieldB必须等于“33”
- 当fieldA == “mm”时,fieldB必须等于“nn”
3. 约束代码
import ConditionStringResultStringConstraintValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ConditionStringResultStringConstraintValidator.class)
@Documented
public @interface ConditionStringResultStringConstraint {
String message() default "{message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String conditionName();
String resultName();
String conditionValue();
String[] resultValue();
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface List {
ConditionStringResultStringConstraint[] value();
}
}
4. 校验器代码
public class ConditionStringResultStringConstraintValidator
implements ConstraintValidator<ConditionStringResultStringConstraint, Object> {
private String conditionName;
private String resultName;
private String conditionValue;
private Set<String> resultValueSet;
@Override
public void initialize(ConditionStringResultStringConstraint conditionResult) {
this.conditionName = conditionResult.conditionName();
this.resultName = conditionResult.resultName();
this.conditionValue = conditionResult.conditionValue();
this.resultValueSet = new HashSet<>(Arrays.asList(conditionResult.resultValue()));
}
@Override
public boolean isValid(Object obj, ConstraintValidatorContext context) {
try {
if (StringUtils.isBlank(this.conditionName) || StringUtils.isBlank(this.resultName)) {
return false;
}
if (StringUtils.isBlank(this.conditionValue) || CollectionUtils.isEmpty(this.resultValueSet)) {
return false;
}
final String conditionFieldValue = BeanUtils.getProperty(obj, this.conditionName);
if (!StringUtils.equals(this.conditionValue, conditionFieldValue)) {
return true;
}
final String resultFieldValue = BeanUtils.getProperty(obj, this.resultName);
if (!this.resultValueSet.contains(resultFieldValue)) {
return false;
}
} catch (Throwable t) {
return false;
}
return true;
}
}