所以,我从SprringBoot开始,对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中,我不会有一个字符串roleName,但实际的RoleEntity,像这样:

public class PersonnelDto {

    @NotBlank
    private String firstName;
    
    @NotBlank
    private String lastName;

    //... other properties

    @NotBlank
    private RoleEntity role;

但是,我不知道如何编写代码,以便自动查询json中的roleName并转换为整个RoleEntity,我只知道必须有一种方法来做到这一点,例如,您可以将Date放入DTO中,然后Date的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读取角色名称并对其进行验证:

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这样的单元测试库进行测试.

Java相关问答推荐

将Nimbus设置为计算机上运行的所有Java应用程序的默认外观

同时运行JUnit测试和Selenium/Cucumber测试时出现问题

屏蔽字母数字代码的Java正则表达式

XPages-在第二次点击按钮之前延迟

在Java中,如何按一个属性升序,然后按另一个属性降序对对象列表进行排序?

使用Mockito进行的Junit测试失败

如何从Keyloak映射Hibernate实体中的用户

用户填充的数组列表永不结束循环

如何在Java中为thunk创建映射器函数

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

泛型与泛型问题的完美解决方案?

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

Java 21内置http客户端固定运营商线程

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

AspectJ编织外部依赖代码,重新打包jar并强制依赖用户使用它

在数组中查找素数时出现逻辑错误

ResponseEntity.控制器截断响应的JSON部分

Maven创建带有特定类的Spring Boot jar和普通jar

语句打印在错误的行(Java Token 问题)

如何使用 JDBC 更改 Postgres Enum 类型