springboot自定义validation注解:多字段属性关联校验
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = FieldsValueMatchValidator.class)
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@interface FieldsValueMatch {
String message() default "Fields value do not match";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String firstFieldName();
String secondFieldName();
}
// 验证器实现
public class FieldsValueMatchValidator implements ConstraintValidator<FieldsValueMatch, Object> {
private String firstFieldName;
private String secondFieldName;
@Override
public void initialize(FieldsValueMatch fieldsValueMatch) {
this.firstFieldName = fieldsValueMatch.firstFieldName();
this.secondFieldName = fieldsValueMatch.secondFieldName();
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
try {
// 反射获取字段值
Field firstField = value.getClass().getDeclaredField(firstFieldName);
firstField.setAccessible(true);
Object firstValue = firstField.get(value);
Field secondField = value.getClass().getDeclaredField(secondFieldName);
secondField.setAccessible(true);
Object secondValue = secondField.get(value);
// 进行比较
return Objects.equals(firstValue, secondValue);
} catch (NoSuchFieldException | IllegalAccessException e) {
// 处理异常,例如记录日志
return false;
}
}
}
这个例子中,我们定义了一个自定义注解FieldsValueMatch
,它用于验证两个字段的值是否相等。然后,我们实现了一个验证器FieldsValueMatchValidator
,通过反射获取指定字段的值,并进行比较。如果字段值不匹配,则验证失败。这个例子展示了如何在Spring Boot中创建和使用自定义注解进行多字段验证。
评论已关闭