java—如何在SpringBoot中将dto转换为实体?

olqngx59  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(910)

我找了无数个问题。但大多数问题如下。
实体->dto
实体和dto具有相同的属性值。
但我不想这样。
如果dto中不存在实体中的属性值,我想知道如何将dto转换为实体。

一些代码

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

用户实体

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

用户DTO

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返回。
这种时候我该怎么办?
没有直接从控制器调用存储库。
服务希望无条件返回dto。
我应该创建一个与用户实体具有相同属性的附加dto吗?

xoefb8l8

xoefb8l81#

通常我按照以下方式来实现我的课程,
实体:包含与实际数据库对象相关的所有数据(附加数据(按@transient annotation)
dto:自定义类,创建该类以提供实体和所需json之间的兼容性。
Map器:它可以将实体转换为dto,反之亦然。
在sort中,为数据库对象创建实体,根据需要创建n个dto,并使用mapper类将其转换为适当的类型,然后在服务类中编写这些术语。因此,根据您的需要创建dto并在服务类中实现逻辑,以便将它们放在一起(当您希望将多个dto绑定到单个实体或将其分散时,最好使用接口或继承。)
现在说到你的问题,
如果dto中不存在实体中的属性值,我想知道如何将dto转换为实体。
答:使用mapper类转换它。根据我的定义,上面的实体是数据库对象,dto应该是json。所以在你的dto里存在并不重要。您可以根据需要定制dto。
没有直接从控制器调用存储库。
回答:很明显,你必须这样做,而且是正确的实现方式。
我应该创建一个与用户实体具有相同属性的附加dto吗?java
回答:可以,但如果需要的话。我的建议是遵循我之前定义的结构,将来也会有帮助,假设你需要新的数据类型,你只需要在mapper类中添加一个函数,它相应地返回数据,你也可以从一个地方修改并使用每个地方。
此建议基于您的代码。
将所有逻辑代码控制器移动到服务类
在服务类中查询并包含userdto的数据。

UserDto userDto = userService.findUser(userId)

它给你发电子邮件。基于此触发另一个fetch user查询。
我个人作为开发商的建议,
创建一个jhipster项目一次,检查他们的流程,它会给你一个关于如何以专业的方式创建结构的好主意。

相关问题