1

Foo2 つのエンティティと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 検証を繰り返すのではなく、再利用したいと考えています。FooFooBarfooIdCreateBarDto.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 注釈がこれに役立つ可能性があるかどうか疑問に思っていますか?

4

1 に答える 1