Проверка Javax на вложенных объектах - не работает - PullRequest
0 голосов
/ 02 января 2019

В моем проекте Spring Boot у меня есть два DTO, которые я пытаюсь проверить, LocationDto и BuildingDto.LocationDto имеет вложенный объект типа BuildingDto.

Это мои DTO:

LocationDto

public class LocationDto {

  @NotNull(groups = { Existing.class })
  @Null(groups = { New.class })
  @Getter
  @Setter
  private Integer id;

  @NotNull(groups = { New.class, Existing.class })
  @Getter
  @Setter
  private String name;

  @NotNull(groups = { New.class, Existing.class, LocationGroup.class })
  @Getter
  @Setter
  private BuildingDto building;

  @NotNull(groups = { Existing.class })
  @Getter
  @Setter
  private Integer lockVersion;

}

BuildingDto

public class BuildingDto {

  @NotNull(groups = { Existing.class, LocationGroup.class })
  @Null(groups = { New.class })
  @Getter
  @Setter
  private Integer id;

  @NotNull(groups = { New.class, Existing.class })
  @Getter
  @Setter
  private String name;

  @NotNull(groups = { Existing.class })
  @Getter
  @Setter
  private List<LocationDto> locations;

  @NotNull(groups = { Existing.class })
  @Getter
  @Setter
  private Integer lockVersion;

}

В настоящее время я могу подтвердить в своем LocationDto, что свойства name и building не равны нулю, но Я не могу проверить наличие идентификатора свойства, которыйвнутри здания .

Если я использую аннотацию @Valid для свойства building, он будет проверять все его поля, но в этом случае я хочу только проверить его id.

Как это можно сделать с помощью проверки javax?

Это мой контроллер:

@PostMapping
public LocationDto createLocation(@Validated({ New.class, LocationGroup.class }) @RequestBody LocationDto location) {
  // save entity here...
}

Это правильное тело запроса: (не должно выдавать ошибки проверки)

{
  "name": "Room 44",
  "building": {
    "id": 1
  }
}

Это неверное тело запроса: (должно выдать ошибки проверки, потому что отсутствует идентификатор здания )

{
  "name": "Room 44",
  "building": { }
}

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Использование @ConvertGroup из Проверка бина 1.1 (JSR-349) .

Ввести новую группу проверки, скажем Pk.class,Добавьте его к groups из BuildingDto:

public class BuildingDto {

    @NotNull(groups = {Pk.class, Existing.class, LocationGroup.class})
    // Other constraints
    private Integer id;

    //
}

А затем в LocationDto каскад, как показано ниже:

@Valid
@ConvertGroup.List( {
    @ConvertGroup(from=New.class, to=Pk.class),
    @ConvertGroup(from=LocationGroup.class, to=Pk.class)
} )
// Other constraints
private BuildingDto building;

Дополнительная литература:

5.5.Групповое преобразование из справочника Hibernate Validator.

0 голосов
/ 02 января 2019

Просто попробуйте добавить @valid в коллекцию.это будет работать согласно ссылке Hibernate

  @Getter
  @Setter
  @valid
  @NotNull(groups = { Existing.class })
  private List<LocationDto> locations;
...