所以,我从springboot开始,对java有中等的了解。我的问题是我有一个名为 Personnel 的实体(或 Model,我不知道它是如何调用的),该实体有一个指向另一个名为 Role 的实体的外键,如下所示:
@Entity(name = "Personnel")
public class PersonnelEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name", length = 50, nullable = false)
private String firstName;
@Column(name = "last_name", length = 50, nullable = false)
private String lastName;
//.... other properties
@ManyToOne()
@JoinColumn
(
name = "role_id",
//nullable = false,
foreignKey = @ForeignKey
(
name = "FK_Personnels_role_id",
foreignKeyDefinition = "FOREIGN KEY (role_id) REFERENCES Roles (id) ON DELETE RESTRICT ON UPDATE CASCADE"
)
)
private RoleEntity role;
而且,我有一个人员 DTO,它具有除 RoleName 验证之外的所有验证:
public class PersonnelDto {
@NotBlank
private String firstName;
@NotBlank
private String lastName;
//... other properties
@NotBlank
private String roleName;
请求中的 json 显然在后台被解析为 DTO,但我想控制一下,在发出请求时,客户端将在 json 中发送角色的名称,并带有注释或其他内容,将检查名称以查看它是否存在于数据库中(因为它是唯一的),如果不存在,则 dto 将不会在任何请求中传递 @valid 注释。
另外,我正在考虑也许在 DTO 中,我不会有一个 String roleName,而是实际的 RoleEntity,如下所示:
public class PersonnelDto {
@NotBlank
private String firstName;
@NotBlank
private String lastName;
//... other properties
@NotBlank
private RoleEntity role;
但是,我不知道如何编码以便自动查询 json 中的 roleName 并将其转换为整个 RoleEntity,我只知道必须有一种方法可以做到这一点,例如您可以将 Date 放入 DTO 中并且日期的 json 字符串会自动转换为 Date 对象。
所以,就我而言,json:
{
"firstName": "val1",
"lastName": "val2",
...,
"roleName": "roleName"
}
将转换为上面的 DTO。
继续,如何检查 json 中的角色名称是否存在于数据库中,如果是,则将其转换为 DTO 中的 RoleEntity 对象?此外,如果不存在,则 DTO 将被视为无效。
您无法直接验证在将 JSON 解析为 DTO 的过程中是否存在其他角色。通过控制器后,您必须在服务中执行此操作。像这样的东西:
在控制器中使用端点中的
@Valid
注释
@PostMapping()
public ResponseEntity<Object> createPersonnel(@RequestBody @Valid PersonnelDto personnelRequest){
// code here...
personnelService.create(personnelRequest);
// code here...
}
现在,在您的服务中,您可以从 DTO 读取 roleName 并验证它:
public void create(PersonnelDto personnelRequest){
// code here...
Optional<RoleEntity> role = roleRepository.findByName(personnelRequest.getRoleName());
if (role.isPresent()) {
// If there is another role with the same name throw an error here...
{
// Otherwise continue with your normal flow here...
}
因此,您将拥有一个可读的代码,可以使用单元测试库(如
JUnit
)进行测试。