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



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

这些是我的 DTO:

位置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;
}

建筑Dto

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中验证属性namebuilding不为空,但我无法验证建筑物内的属性 ID 是否存在

如果我在 building 属性上使用 @Valid 注释,它将验证其所有字段,但在这种情况下,我只想验证其id

如何使用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": { }
}

只需尝试将@valid添加到集合中即可。 它将按照参考休眠工作

  @Getter
  @Setter
  @Valid
  @NotNull(groups = { Existing.class })
  private List<LocationDto> locations;
<</div> div class="one_answers">必须

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

位置DTO.class

public class LocationDto {
  @Valid
  private BuildingDto building;
   
  .........
}

使用 Bean Validation 1.1 (JSR-349) 中的@ConvertGroup

引入一个新的验证组说Pk.class .将其添加到BuildingDto groups

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. 从休眠验证器参考进行组转换。

最新更新