嵌套对象的 Javax 验证 - 不工作
Javax validation on nested objects - not working
在我的 Spring 引导项目中,我有两个我试图验证的 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.
如果我在 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
}
}
这是一个不正确的请求正文:(必须抛出验证错误,因为缺少 building id)
{
"name": "Room 44",
"building": { }
}
只需尝试将 @valid
添加到 collection。它将按照参考 hibernate
工作
@Getter
@Setter
@Valid
@NotNull(groups = { Existing.class })
private List<LocationDto> locations;
使用@ConvertGroup
from Bean Validation 1.1 (JSR-349).
引入一个新的验证组说 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. Group conversion 来自 Hibernate Validator 参考。
@必须将有效注释添加到级联 class 属性。
LocationDTO.class
public class LocationDto {
@Valid
private BuildingDto building;
.........
}
在我的 Spring 引导项目中,我有两个我试图验证的 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.
如果我在 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
}
}
这是一个不正确的请求正文:(必须抛出验证错误,因为缺少 building id)
{
"name": "Room 44",
"building": { }
}
只需尝试将 @valid
添加到 collection。它将按照参考 hibernate
@Getter
@Setter
@Valid
@NotNull(groups = { Existing.class })
private List<LocationDto> locations;
使用@ConvertGroup
from Bean Validation 1.1 (JSR-349).
引入一个新的验证组说 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. Group conversion 来自 Hibernate Validator 参考。
@必须将有效注释添加到级联 class 属性。
LocationDTO.class
public class LocationDto {
@Valid
private BuildingDto building;
.........
}