如何在 Spring 启动时将 DTO 转换为实体?

How can convert DTO to Entity in Spring boot?

我找了无数问题。 但是大部分问题如下。

  1. 实体 -> Dto
  2. 实体和 Dto 具有相同的属性值。

但我不想要这个。

我想知道当实体中存在的 属性 值在 Dto 中不存在时如何将 Dto 转换为实体。

一些代码

不指定 [annotations, Lombok, jpa, ...etc] 的代码 但它存在!

用户实体

class User {
  Long id,
  String username,
  String email,
  String password
}

UserDto

class UserDto {
  String email
}

Post实体

class Post {
  Long id,
  String title,
  User user

}

PostDto

class PostDto {
  Long id,
  String title,
  String username
}

用户服务

...

UserDto findUser(id: Long) {
   ...
}

...

Post服务

...

PostDto savePost(Post post) {
   ...
}

...

Post控制器

...

PostDto createPost(@RequestBody PostDto postDto) {
  // spring security
  Long userId = XXX.getUserId()  

  ....

  UserDto userDto = userService.findUser(userId)
  
  // HERE !! what can i do ??
  // How can i convert userDto to user ?

  Post post = new Post(postDto.title, user)
  PostDto newPost = postService.savePost(post)
}

...

问题

DTO 中 userService return 的所有方法。 如何在 Post 实体中设置用户实体? 我收到了一个只有用户名的 userDto return。

遇到这种情况怎么办?

  1. 存储库不是直接从控制器调用的。
  2. 服务想要return DTO 无条件。
  3. 我应该创建一个与用户实体具有相同属性的附加 Dto 吗?

通常我 class 按照以下方式实施,

实体: 包含与您的实际数据库对象相关的所有数据。 (@transient 注释的附加数据)

DTO : 自定义 class 创建以提供实体与所需 JSON.

之间的兼容性

Mapper : 它可以将 Entity 转换为 DTO,反之亦然。

在排序中,为数据库对象创建实体,n 个 DTO 以确保真实需要并使用映射器 class 将其转换为适当的类型并将此条款写入您的服务 class。因此,根据您的需要创建 DTO 并在服务 class 中实现将它们组合在一起的逻辑。 (当想在单个实体中绑定多个 DTO 或将其分散时,最好使用接口或继承。)

现在来回答你的问题,

  1. 我想知道当实体中存在的 属性 值在 DTO 中不存在时如何将 DTO 转换为实体。

    答案:使用 Mapper class 转换它。根据我上面的定义,实体是数据库对象,并且 DTO 是预期的 JSON。因此,在您的 DTO 中强制存在并不重要。您可以根据需要自定义 DTO。

  2. 存储库不是直接从控制器调用的。

    答案:很明显,您必须这样做,并且采用正确的实施方式。

  3. 我是否应该创建一个与用户实体具有相同属性的附加 DTO? java

    回答:可以,但如果是强制要求的话。我的建议是遵循我之前定义的结构,它在将来也会有帮助,假设你需要一种新的数据,你只需要在映射器 class 中添加一个函数,它相应地 return 数据,你也可以修改从一个地方开始,到处使用。

此建议基于您的代码。

  1. 将所有逻辑代码控制器移至服务 class
  2. 在服务中 class 触发查询并包含 userDTO 的数据。
UserDto userDto = userService.findUser(userId)
  1. 它给你电子邮件。基于此激发另一个获取用户的查询。

我作为开发者的个人建议,

创建一个 JHipster 项目并检查它们的流程,它可以让您了解如何以专业的方式创建结构。