如何确定springboot将json字段转换为Dto时如何处理?

问题描述 投票:0回答:1

所以,我从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 将被视为无效。

java json spring-boot annotations dto
1个回答
0
投票

您无法直接验证在将 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
)进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.