javax.validation.ConstraintDeclarationException: HV000131.分层



>我有下一个层次结构:

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 是具有应验证为 NotNull 的 C 属性以及 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 对此进行测试时,如果令牌值(值 1 和值 2)为空,则不会验证 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 的原因超出了这个问题的范围。我抓住了约束违规,而是抛出了非法参数异常。

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

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

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

我在测试用javax.validation.valid注释的 REST 服务时遇到了同样的问题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:

基于这个自动值问题,我认为这里也可能发生同样的情况。默认情况下,Mockito会复制所有注释。所以我能够通过防止这种情况来解决这个问题。

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

与自动取值解决方案相比,缺点是不会复制注释。因此,如果您需要它们,那么您就会陷入困境。

问候克里斯蒂安

相关内容

  • 没有找到相关文章

最新更新