当前位置: 首页 > 知识库问答 >
问题:

如何在Spring boot中将DTO转换为实体?

许承悦
2023-03-14

我找了无数的问题。但大多数问题如下。

  1. 实体-

但我不想这样。

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

没有为[annotations,Lombok,jpa,…]指定代码,但是它存在!

class User {
  Long id,
  String username,
  String email,
  String password
}
class UserDto {
  String email
}
class Post {
  Long id,
  String title,
  User user

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

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

...
...

PostDto savePost(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)
}

...

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

这种时候我该怎么办?

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

共有1个答案

郑锦
2023-03-14

通常我用以下方式来实现我的类,

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

DTO:自定义类,创建该类以提供实体和所需JSON之间的兼容性。

映射器:它可以将实体转换为DTO,反之亦然。

在排序中,为数据库对象创建实体,n个DTO以满足需要,并使用mapper类将其转换为适当的类型,并在服务类中编写此术语。所以,根据您的需要,创建DTO并在服务类中实现逻辑,以便将它们集合在一起。(当需要将多个DTO绑定到单个实体中或将其分散时,最好使用接口或继承。)

现在来问你的问题,

>

  • 我想知道如何将DTO转换为实体,如果实体中的属性值在DTO中不存在。

    答:使用Mapper类转换它。根据我上面的定义,实体是数据库对象,DTO应该是JSON。因此,它存在于DTO中并不重要。您可以根据需要定制DTO。

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

    答:很明显,你必须这样做,并以正确的方式实现。

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

    答:可以,但如果需要的话。我的建议是遵循我前面定义的结构,它在将来也会很有用,假设您需要新的数据类型,您只需在mapper类中添加一个函数,它将相应地返回数据,您还可以从单个位置修改并在每个位置使用。

    此建议基于您的代码。

    1. 将您的全逻辑代码控制器移至服务类
    UserDto userDto = userService.findUser(userId)
    

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

    创建一个JHipster项目一次,并检查它们的流程。它为您提供了关于如何以专业方式创建结构的好主意。

  •  类似资料:
    • 好的,我有三个实体:主题、用户、类别、图片。用户有图片,主题有用户和类别。 我还有一个话题要讲 我可以将ModelMapper注入TopicService,并使用它进行转换,但它不能按照我的需要工作,在这种情况下,如果我试图将Topic转换为TopicDTO,在转换后的TopicDTO对象中,UserDTO和CategoryTo将为null,但在调试中,在转换之前,在Topic对象中,Catego

    • 我有一个项目,我需要在数据库中存储用户。我正在使用Hibernate,在模块的某些部分中,也在实验性地使用Spring数据JPA。我有一个用于注册客户的RESTendpoint,并在那里接收UserDTO对象。之后,在其他服务中,我需要将其转换为UserEntity并保存在数据库中。 现在我创建了用户设置页面,我需要显示一些关于登录用户的信息。我不想发送UserDTO对象,因为有太多的数据,所以我

    • 我正在尝试将复杂的实体转换为Dto。我想从DTO中删除实体中的一些值。 我的实体看起来像这样(为了简单起见,省略了实体的大部分): 我找到了一个对简单实体非常有效的解决方案:将实体转换为数据。如果我采纳了自定义拦截器的建议,删除id或整个item属性就可以了。 我尝试了两种方法来定义我的DTO: < li >它仅返回id和整个项目。 现在的问题是我只想删除 item 属性中的某些值。例如,私有字段

    • 如何正确转换dto到json在Java?我这样做就像下面使用: 问题在于格式化字段。在Dto我有我的日期在这种格式:但转换此dto到json字节后,我看到我的拆分为对象与许多属性如下: 在使用之后,我希望将中的所有属性以与转换之前相同的格式进行转换。如何做到这一点? 谢谢你的帮助!

    • 我是Mapstruct的新手,我正在努力正确理解它。 我想实现的是从DTO字符串参数(carModel)转换为他的实体,使用服务和存储库进行检索。 问题是Mapstruct生成的Mapper类正在尝试向Service类注入注释,但它不起作用。服务为空。 这是我的课程: 类: 类: DTO和实体类: 构建工作正常,但当我尝试使用Mapper时,应用程序停止。它说carModelService是空的。

    • 我正在尝试制作一个基于数据库的API,我有一个巨大的数据负载,但每次我尝试使用可分页属性的数据时,我都会得到这个错误: 在数据库中,我有大量的11795篇文章以及它们与其他表的各自关系,有一种方法可以优化此负载或只是使其工作? 第条实体: 活动和启动实体: 存储库只是一个接口,JpaRepository和文章作为实体。 服务类别: 如果我只是使用我的实体作为返回,这些方法可以工作,但是当我将其转换