是否可以手动添加约束违规?
E.g:
// validate customer (using validation annotations)
Set<ConstraintViolation<Customer>> violations = validator.validate(customer);
if (someSpecialCase) {
violations.add(..)
}
问题是add
方法接受ConstraintViolation接口,但javax.validation包中不包含可以使用的实现者。
有什么想法吗?
答案 0 :(得分:3)
我相信您正在使用Hibernate验证器。
如果是这种情况,那么根据您的特殊情况,您可能希望为Customer
编写自定义类级验证器,并在约束违规集中捕获它。 / p>
由于我不知道你的Customer
bean是什么样的,所以我最多只能为你提供一个关于这种方法的总体方向。
// Annotation
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Constraint(validatedBy = CustomerValidator.class)
public @interface ValidCustomer {
String message() default "Invalid customer (due to edge case)";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
// Validator
public class CustomerValidator implements ConstraintValidator<ValidCustomer, Customer> {
@Override
public void initialize(final ValidCustomer constraintAnnotation) {
}
@Override
public boolean isValid(final Customer value,
final ConstraintValidatorContext context) {
// logic for validation according to your edge case
}
}
然后,您将使用此验证器注释您的Customer
课程。
@ValidCustomer
public class Customer {
// ...
}
在此之后,您的特定约束将在violations
中捕获。
答案 1 :(得分:3)
简短的回答是:“不,没有办法手动添加约束违规”。
详细说明一下。如你所说,所涉及的所有类都是接口。如果您真的认为自己想要这样做,可以实现自定义 ConstraintViolationImpl 。但是,我想知道你的实际用例是什么?为什么要在没有验证的情况下添加约束违规?正如答案https://stackoverflow.com/a/23727169/115835所暗示的那样,您可以始终通过类级自定义约束。作为自定义 ConstraintValidator 实现中 isValid 的一部分,您将获得 ConstraintValidatorContext ,这将允许您添加其他约束违规。