javax.validation.ConstraintDeclarationException:HV000131。分层对象中的级联验证

javax.validation.ConstraintDeclarationException:HV000131。分层对象中的级联验证,java,spring,mockito,hibernate-validator,javax.validation,Java,Spring,Mockito,Hibernate Validator,Javax.validation,我有下一个层次结构: public class A extends B { @Valid public A(String languageCode, C token) { super(languageCode, token); } } B类有一个属性调用语言代码,只有当服务具有@validated({requireringlanguagecode.class})时,才应使用@NotEmpty验证该代码 现在,D是具有C属性的基类,该属性应验证为NotNull

我有下一个层次结构:

public class A extends B {
   @Valid 
   public A(String languageCode, C token) {
      super(languageCode, token);
   }  
}
B类有一个属性调用语言代码,只有当服务具有@validated({requireringlanguagecode.class})时,才应使用@NotEmpty验证该代码

现在,D是具有C属性的基类,该属性应验证为NotNull,同时也是C类内部的值

public class D {

    private C token;

    @Valid
    public D(C token) {
        this.token = token;
    }

    @NotNull
    public C getToken() {
        return token;
    }
}
C类包含两个验证为@NotEmpty的字符串:

public class C {

    private String value1;

    private String value2;

    public C(String value1,
            String value2) {
        this.value1 = value1;
        this.value2 = value2;
    }

    @NotEmpty
    public String getValue1() {
        return value1;
    }

    @NotEmpty
    public String getValue2() {
        return value2;
    }
}
尝试使用mockito测试时,如果令牌值(value1和value2)为空,则不会验证C类的值。

有人能帮我吗? 有人知道发生了什么吗?

试验如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("test")
public class ATest {

    @Autowired
    private AAssembler aAssembler;

    @Mock
    A request;

    @Mock
    C token;

    @Test
    public void test() {
        when(token.getValue1()).thenReturn("");
        when(token.getValue2()).thenReturn("key");
        when(request.getToken()).thenReturn(token);
        assertThatIllegalArgumentException()
           .isThrownBy(() -> aAssembler.build(request));
    }
}
AASembler被注释为@Validated({RequiringLanguageCode.class})

我启动IllegalArgumentException而不是ConstraintViolationException的原因超出了这个问题的范围。我捕获约束冲突并抛出IllegalArgumentException

汇编程序构建方法还有一个约束,注释如下:

public Response build(@Valid @NotNull A request) {
....
} 

如果有人能帮助我,我将非常感激。无论如何,谢谢。

我也遇到了同样的问题
javax.validation.ConstraintDeclarationException:HV000131:在类层次结构中,方法返回值不能多次标记为级联验证,但是以下两种方法被标记为:
在测试带有
javax.validation.valid注释的REST服务时

基于这个自动值,我想这里也会发生同样的情况。默认情况下,Mockito将显示所有注释。所以我能够通过阻止这个来解决这个问题

A stub = Mockito.mock(A.class, withSettings().withoutAnnotations());
与AutoValue解决方案相比的缺点是不会复制任何注释。所以,如果你需要它们,你就被卡住了

问候Christian

谢谢它的帮助!
A stub = Mockito.mock(A.class, withSettings().withoutAnnotations());