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

问题描述 投票:1回答:1

我有下一个层次结构。

public class A extends B {
   @Valid 
   public A(String languageCode, C token) {
      super(languageCode, token);
   }  
}

B类有一个属性调用语言代码,只有当一个服务有@Validated({RequiringLanguageCode.class})时,才应该用@NotEmpty来验证。

 public class B extends D {

    private String languageCode;

    @Valid
    public B(String languageCode, C token) {
        super(token);
        this.languageCode = languageCode;
    }

    @NotEmpty(groups = {RequiringLanguageCode.class})
    public String getLanguageCode() {
        return languageCode;
    }
}

现在,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类包含两个String,被验证为@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测试时,如果token值(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));
    }
}

AAssembler被注释为@Validated({RequiringLanguageCode.class})

为什么我发起IllegalArgumentException而不是ConstraintViolationException的原因是这个问题的范围之外的东西。我抓住了约束违反,并抛出IllegalArgumentException,而不是。

Assembler构建方法也有一个注解为.NET的约束。

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

如果有人能帮助我,我将非常感激。还是谢谢你。

java spring mockito hibernate-validator javax.validation
1个回答
0
投票

我也有同样的问题 javax.validation.ConstraintDeclarationException: HV000131: A method return value must not be marked for cascaded validation more than once in a class hierarchy, but the following two methods are marked as such: 的REST服务进行测试时,用 javax.validation.valid.

基于这个AutoValue 发出 我想也许这里也会发生同样的事情。莫基托 副本 默认情况下,所有的注释。所以我能够通过防止这个问题来解决这个问题。

A stub = Mockito.mock(A.class, withSettings().withoutAnnotations());

与AutoValue解决方案相比,缺点是没有注释会被复制。所以如果你需要它们,你就会被卡住。

祝贺Christian

© www.soinside.com 2019 - 2024. All rights reserved.