【问题标题】:How to set default group in bean validation context如何在 bean 验证上下文中设置默认组
【发布时间】:2015-08-21 15:37:58
【问题描述】:

我正在处理 bean 验证,我正在寻找一种可能性来设置我自己的 bean 验证注释的默认组。

我有这样的东西(工作):

Application.class(在 MyBean 上调用 validate)

public class Application {
    public static void main(String[] args) {
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        Set<ConstraintViolation<MyBean>> violations =
            validator.validate(new MyBean(), SecondStep.class);
    }
}

MyBean.class(bean 本身;这是我想要阻止的)

public class MyBean {
    // I don't want to write this "groups" attribute every time, because it's very clear,
    // that this should only be validated for the second step, isn't it?
    @RequiredBySecondStep(groups=SecondStep.class)
    private Object myField;
}

RequiredBySecondStep.class(bean 验证注解)

@Documented
@Target(FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = RequiredBySecondStepValidator.class)
public @interface RequiredBySecondStep {
    String message() default "may not be null on the second step";
    Class<?>[] groups() default {};   // <-- here I want to set SecondStep.class
    Class<? extends Payload>[] payload() default {};
}

RequiredBySecondStepValidator.class(已实现的约束验证器)

public class RequiredBySecondStepValidator implements ConstraintValidator<RequiredBySecondStep, Object> {
    public void initialize(RequiredBySecondStep constraintAnnotation) {
    }

    public boolean isValid(Object object, ConstraintValidatorContext constraintContext) {
        return object != null;
    }
}

SecondStep.class(bean 验证组)

public interface SecondStep {
}

不幸的是,规范无法像这样在RequiredBySecondStep 注释中设置默认组:

Class<?>[] groups() default SecondStep.class;
// and using just the following in the bean:
@RequiredBySecondStep
private Object myField;

这将导致 RuntimeException:

javax.validation.ConstraintDefinitionException:默认值 groups() 必须是一个空数组

此外,不仅有SecondStep。可能有 5 个不同的组我想直接用 @RequiredByFirstStep@RequiredByFifthStep 注释。

有没有好的方法来实现这个?

【问题讨论】:

    标签: java bean-validation validationgroup


    【解决方案1】:

    我认为你搞错了。确实有办法做你想做的事,这是因为约束方面及其通过ConstraintValidator 进行的验证与组和组序列正交。根据设计,约束(注释及其验证器)应该独立于被验证的组。即使你能让它工作,它也不会是可移植的约束。就个人而言,我会重新考虑您想要实现的目标。 @RequiredByFirstStep 没有告诉你要求是什么。您应该开发约束来暗示它们正在验证的内容(字符串长度,不为空等),何时或更好地执行它们的条件是由组接口控制的。

    【讨论】:

    • 感谢您的回答!所以解决方案只能是@NotNull(groups=SecondStep.class)?我想将这些注释的使用简化为@RequiredBySecondStep,因为大约有一千个不同的开发人员必须注释这些字段的地方。并且验证将始终是“步骤 XY 是否需要此字段?”。但是,好吧,你可能是对的。我什至不必编写自己的ConstraintValidator,因为我需要带有特定组的@NotNull 注释。
    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多