据我所知,只能获取当前验证值以及注释方法中的值(最小值、最大值等)。如果有人真的知道方法,请随时纠正我。
要实现对另一个属性值的访问,您需要在类型级别上自定义验证注释。我假设保存数据的类称为MyModel。注释可能如下所示:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyModelApplicationSizeValidator.class)
public @interface MyModelApplicationSize {
String message() default "default message";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
int min() default 0;
int max() default Integer.MAX_VALUE;
}
以及这个注解的实际验证器:
import com.example.random.model.MyModel;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class MyModelApplicationSizeValidator implements ConstraintValidator<MyModelApplicationSize, MyModel> {
private int min;
private int max;
private String msgFormat;
@Override
public void initialize(MyModelApplicationSize constraintAnnotation) {
this.min = constraintAnnotation.min();
this.max = constraintAnnotation.max();
this.msgFormat = constraintAnnotation.message();
}
@Override
public boolean isValid(MyModel model, ConstraintValidatorContext context) {
String value = model.getApplication();
if (value == null || value.isEmpty() || value.length() < this.min || value.length() > this.max) {
context.disableDefaultConstraintViolation();
String message = String.format(this.msgFormat, this.min, this.max, value, model.getId());
context.buildConstraintViolationWithTemplate(message).addConstraintViolation();
return false;
}
return true;
}
}
请记住,使用 String.format 构建错误消息并不是最好的方法,它有点脆弱,您实际上可能需要根据您的需要以另一种方式实现它。
还有MyModel,用新注解验证:
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
@MyModelApplicationSize(message = "application accepts min length of %d and max length of %d for val - %s with id - %s", min = 2, max = 7)
public class MyModel {
@NotEmpty(message="Id must not be empty")
@Size(min=1, max=70, message="Id accepts max length of 70")
private String id;
@NotEmpty(message="application must not be empty")
@Size(min=1, max=8, message="application accepts min length of {min} and max length of {max} for val - ${validatedValue}")
private String application;
//getters and setters
}