在 Java Bean Validator 中使用 Class 参数
Use Class Paramater in Java Bean Validator
我有一个 class 并且我正在使用 Java Bean 验证并且我想使用 classes 变量之一作为验证器中的参数,所以如果我有一些东西看起来像
public class person{
@NotNull
@NotEmpty
public int age;
@CustomValidator(Parameter = age)
public dateTime birthdate
}
然后自定义验证器可以使用年龄来验证生日,有没有办法做到这一点或做 java bean 不允许这样做?我已经尝试过只输入参数,但它似乎并不喜欢那样。请帮忙。
我认为没有办法将它实现为注释本身中的参数,因为这要求这些值是静态的——您希望它是基于年龄值的动态值。
您可以将自定义约束放在 birthdate 字段本身,而不是放在 class 级别。通过这样做,您可以访问 Person 对象中的所有字段,并且可以执行逻辑以根据提供的年龄验证生日。我用 birthdate 的字符串类型对此进行了测试,因此您必须修改它以满足您的日期需求。
BirthdateConstraint.java -
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;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = BirthdateValidator.class)
public @interface BirthdateConstraint {
String message() default "Custom error message";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
BirthdateValidator.java -
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class BirthdateValidator implements ConstraintValidator<BirthdateConstraint, Person> {
@Override
public boolean isValid(Person value, ConstraintValidatorContext context) {
int age = value.age;
String birthdate = value.birthdate;
// do validation logic here - return true/false
}
}
Person.java -
import javax.validation.constraints.Min;
@BirthdateConstraint
public class Person {
@Min(value = 1)
public int age;
public String birthdate;
}
我有一个 class 并且我正在使用 Java Bean 验证并且我想使用 classes 变量之一作为验证器中的参数,所以如果我有一些东西看起来像
public class person{
@NotNull
@NotEmpty
public int age;
@CustomValidator(Parameter = age)
public dateTime birthdate
}
然后自定义验证器可以使用年龄来验证生日,有没有办法做到这一点或做 java bean 不允许这样做?我已经尝试过只输入参数,但它似乎并不喜欢那样。请帮忙。
我认为没有办法将它实现为注释本身中的参数,因为这要求这些值是静态的——您希望它是基于年龄值的动态值。
您可以将自定义约束放在 birthdate 字段本身,而不是放在 class 级别。通过这样做,您可以访问 Person 对象中的所有字段,并且可以执行逻辑以根据提供的年龄验证生日。我用 birthdate 的字符串类型对此进行了测试,因此您必须修改它以满足您的日期需求。
BirthdateConstraint.java -
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;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = BirthdateValidator.class)
public @interface BirthdateConstraint {
String message() default "Custom error message";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
BirthdateValidator.java -
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class BirthdateValidator implements ConstraintValidator<BirthdateConstraint, Person> {
@Override
public boolean isValid(Person value, ConstraintValidatorContext context) {
int age = value.age;
String birthdate = value.birthdate;
// do validation logic here - return true/false
}
}
Person.java -
import javax.validation.constraints.Min;
@BirthdateConstraint
public class Person {
@Min(value = 1)
public int age;
public String birthdate;
}