我有一个包含两个实体Foo
和Bar
一对多关系的 API,即每个实体都Bar
必须引用一个Foo
.
我有端点来创建两者Foo
,并且Bar
- 这些端点具有使用 javax 验证定义的各自的 DTO。
public class CreateFooDto {
@NotNull public Integer field1;
@Length(min=1, max=8) public String field2;
}
public class CreateBarDto {
@NotNull public Boolean field1;
@NotEmpty public String field2;
@NotNull public String fooId; // the foreign key to Foo
}
现在,我想要一个新的端点,它创建一个Bar
and Foo
并将它们链接在一起,而不是先创建一个Foo
然后创建Bar
传递的fooId
. 我将需要所有相同的字段,具有相同的验证,但CreateBarDto.fooId
需要除外。理想情况下,我想重用我已经定义的 javax 验证,而不是重复它们。
我想将现有的 DTO 嵌套在新端点的组合 DTO 中,但是这样做有问题@NotNull
-CreateBarDto.fooId
实际上不需要。到目前为止,我想出的最佳解决方案是:
public class CreateBarWithFooDto {
@Valid public CreateFooDto foo;
@Valid public CreateBarDto bar;
}
public class CreateBarDto {
@NotNull public Boolean field1;
@NotEmpty public String field2;
public String fooId; // the foreign key to Foo
public boolean fooIdNotRequired; // optional flag to indicate fooId not required
@AssertTrue
public boolean isFooIdRequired() {
return fooIdNotRequired || fooId != null;
}
}
虽然这行得通,但它真的很笨重。只是想知道是否有人可以建议一个更好的模式来重用这样的 javax 验证,或者是否有任何我不知道的 javax 注释可能有助于解决这个问题?