Foo
2 つのエンティティと1 対多の関係を持つ API があります。Bar
つまり、それぞれ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
て 一緒にリンクする新しいエンドポイントが必要です。必須であることを除いて、同じ検証ですべて同じフィールドが必要になります。理想的には、定義済みの javax 検証を繰り返すのではなく、再利用したいと考えています。Foo
Foo
Bar
fooId
CreateBarDto.fooId
新しいエンドポイントの結合された 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 注釈がこれに役立つ可能性があるかどうか疑問に思っていますか?