对嵌套对象进行 Javax 验证 - 不起作用

2022-09-01 18:04:16

在我的Spring Boot项目中,我有两个DTO,我正在尝试验证,LocationDto和BuildingDto。LocationDto 具有一个类型为 BuildingDto 的嵌套对象。

这些是我的 DTO:

位置迪托

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;

}

建筑

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;

}

目前,我可以在我的中验证属性和不为空,但我无法验证建筑物内的属性ID是否存在LocationDtonamebuilding

如果我在属性上使用注释,它将验证其所有字段,但对于这种情况,我只想验证其.@Validbuildingid

如何使用javax验证来完成?

这是我的控制器:

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

这是正确的请求正文:(不应引发验证错误)

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

这是不正确的请求正文:(必须引发验证错误,因为缺少建筑物 ID)

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

答案 1

只需尝试添加到集合中即可。它将按照引用休眠的方式工作@valid

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

答案 2

必须将@Valid注释添加到级联类属性中。

位置DTO.class

public class LocationDto {

  @Valid
  private BuildingDto building;
   
  .........

}

推荐