在我的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
是否不为空,但是我无法验证是否存在属性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": { }
}
答案 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;
.........
}