Java 手动添加约束冲突

Java 手动添加约束冲突,java,bean-validation,Java,Bean Validation,是否可以手动添加约束冲突 例如: //验证客户(使用验证注释) 设置冲突=验证程序。验证(客户); 如果(某些特殊情况){ 违反。添加(…) } 问题是add方法接受ConstraintViolation接口,但javax.validation包不包含可使用的实现程序 有什么想法吗?我相信您正在为此使用Hibernate验证器 如果是这种情况,那么根据您的特殊情况,您可能希望为客户编写一个自定义类级验证器,并将其捕获到约束冲突集中 因为我不知道你的客户bean是什么样子,所以我最多只能为你提供

是否可以手动添加约束冲突

例如:

//验证客户(使用验证注释)
设置冲突=验证程序。验证(客户);
如果(某些特殊情况){
违反。添加(…)
}
问题是
add
方法接受ConstraintViolation接口,但javax.validation包不包含可使用的实现程序


有什么想法吗?

我相信您正在为此使用Hibernate验证器

如果是这种情况,那么根据您的特殊情况,您可能希望为
客户
编写一个自定义类级验证器,并将其捕获到约束冲突集中

因为我不知道你的
客户
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
    }
}
在此之后,您的特定约束将被捕获到
违规

中。简短的回答是:“不,无法手动添加约束违规”


详细说明一下。正如您所说,所有涉及的类都是接口。如果您真的想这样做,可以实现定制的ConstraintViolationImpl。然而,我想知道您的实际用例是什么?为什么要添加未经验证的约束冲突?正如答案所示,您可以始终通过类级别的自定义约束。作为自定义ConstraintValidator实现中isValid的一部分,您将获得一个ConstraintValidator上下文,该上下文将允许您添加其他约束冲突。

您使用的是哪个软件包?这不是标准的java.OK,基本上我想做的是使一些字段不可更新。因此,根据REST操作(创建vs.更新),该验证是否应该发生。@MarcelOverdijk,然后您应该查看验证组。是的,我知道我可以像这样添加自定义验证。我想要实现的是,实体的特定字段一旦创建就无法更新。验证框架并不认为它是更新的上下文。有什么建议吗?
// 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
    }
}
@ValidCustomer
public class Customer {
    // ...
}