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

时间:2019-01-01 21:51:35

标签: java spring spring-boot bean-validation

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

如果我在@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
  }
}

这是一个不正确的请求正文:(必须抛出验证错误,因为缺少 建筑物ID

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

3 个答案:

答案 0 :(得分:1)

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

引入一个新的验证组,例如Pk.class。将其添加到groups的{​​{1}}中:

BuildingDto

然后在public class BuildingDto { @NotNull(groups = {Pk.class, Existing.class, LocationGroup.class}) // Other constraints private Integer id; // } 中级联,如下所示:

LocationDto

进一步阅读:

5.5. Group conversion(来自Hibernate Validator参考)。

答案 1 :(得分:0)

只需尝试将@valid添加到集合中。它将按照参考文献hibernate

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

答案 2 :(得分:0)

必须在级联类属性中添加@Valid注解。

LocationDTO.class

public class LocationDto {

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

}