Java @interface.List 组不在自定义约束注释中工作

Java @interface.List Groups not working within Custom constraint annotations

我创建了一个自定义注释,@Size.List 对不同的组具有不同的约束。

使用此方法验证变量时,它会同时使用两个约束,而不是针对所选组的约束。

但非分组注释正常工作 代码示例:

@Size.List({
    @Size(max = 1, groups = Group1.class),
    @Size(max = 2, groups = Group2.class) })�@OtherAnnotationsThatWork
public @interface FooAnnotation {

    String message() default “Bar”;
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default{};
}

public Class Bar{
    public Bar(String foo){ Foo = foo; }

    //doesn’t work
    @FooAnnotation
    private Foo;

    //getters and setters 
}

@Test
Private barTest(){
    Bar bar1 = new Bar(“a”);
    Validate(bar1, group1.class);

    Bar bar2 = new Bar(“bb”);
    //fails because size is greater than max of 1
    Validate(bar2, group2.class) 
}

我也知道这不是由@Size.List 或我的组设置不正确引起的,因为以下代码有效。

@OtherAnnotationsThatWork
public @interface FooAnnotation {

    String message() default “Bar”
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default{};
}

public Class Bar{
    public Bar(String foo){ Foo = foo; }

    @Size.List({
        @Size(max = 1, groups = Group1.class),
        @Size(max = 2, groups = Group2.class) })
    @FooAnnotation
    private Foo;

    //getters and setters 
}

@Test
Private barTest(){
    Bar bar1 = new Bar(“a”);
    Validate(bar1, group1.class);

    Bar bar2 = new Bar(“bb”);
    Validate(bar2, group2.class) //passes
}

那么问题来了。如何使组在自定义注释中工作。

根据 Bean 验证规范(section 3.3,约束组合),不考虑组合约束的组(例如示例中的 @Size 约束):

Groups from the main constraint annotation are inherited by the composing annotations. Any groups definition on a composing annotation is ignored.

即你的第二个例子是要走的路。

此规则背后的基本原理是在约束定义本身不定义任何组成员资格的意义上保持一致(并且这些组合约束是约束定义的一部分)。