Шаблон для повторного использования аннотации проверки Javax при «объединении» двух конечных точек - PullRequest
1 голос
/ 07 мая 2019

У меня есть API с двумя сущностями Foo и Bar с отношением один-ко-многим, то есть каждый Bar должен ссылаться на Foo.

У меня есть конечные точки для создания Foo и Bar - эти конечные точки имеют соответствующие DTO, определенные с помощью валидации javax.

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 и 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, о которых я не знаю, которые могут помочь с этим?

1 Ответ

1 голос
/ 07 мая 2019

Один из вариантов - работа с группами проверки. Javadoc для javax.validation.groups говорит:

Группа определяет подмножество ограничений. Вместо проверки всех ограничений для данного графа объектов проверяется только подмножество в зависимости от целевой группы.

Каждое объявление ограничения определяет список групп, к которым оно принадлежит. Если ни одна группа не объявлена ​​явно, ограничение относится к группе по умолчанию.

При применении валидации передается список целевых групп. Если ни одна группа явно не передается, используется группа javax.validation.groups.Default.

Итак, чтобы дать вам пример в CreateBarDto , у нас может быть новая группа MyFirstGrup.class , которая определена только для проверок для field1 и field2

public class CreateBarDto {
  @NotNull(groups = {MyFirstGrup.class}) 
  public Boolean field1;
  @NotEmpty(groups = {MyFirstGrup.class})
  public String field2;

  @NotNull public String fooId; // the foreign key to Foo
}

Теперь вам нужно вызвать эту конкретную группу, которая обычно через

validator.validate(yourBean, MyFirstGrup.class);

Если вы используете Spring, проверьте аннотацию @Validated, в которой есть поддержка для определения группы, которую вы хотите запустить. Подробнее здесь

...