我有下一个层次结构:
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类包含两个已验证为@NotEmpty的String:
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;
}
}
在尝试使用模拟进行测试时,如果令牌值(值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的原因超出了此问题的范围。我捕获到约束违规并抛出IllegalArgumentException。
Assembler构建方法还具有一个约束,其标注为:
public Response build(@Valid @NotNull A request) {
....
}
如果有人能帮助我,我将非常感激。还是谢谢。
答案 0 :(得分: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 issue,我认为这里也可能发生相同的情况。 Mockito copies默认为所有注释。因此,我能够通过防止这种情况来解决此问题。
A stub = Mockito.mock(A.class, withSettings().withoutAnnotations());
与AutoValue解决方案相比,缺点是不会复制任何注释。因此,如果您需要它们,您将陷入困境。
关于基督徒