手动添加约束违规

时间:2014-05-18 18:55:31

标签: java bean-validation

是否可以手动添加约束违规?

E.g:

// validate customer (using validation annotations)
Set<ConstraintViolation<Customer>> violations = validator.validate(customer);

if (someSpecialCase) {
    violations.add(..) 
}

问题是add方法接受ConstraintViolation接口,但javax.validation包中不包含可以使用的实现者。

有什么想法吗?

2 个答案:

答案 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 ,这将允许您添加其他约束违规。