如何在 Spring 启动时将 DTO 转换为实体?
How can convert DTO to Entity in Spring boot?
我找了无数问题。
但是大部分问题如下。
- 实体 -> Dto
- 实体和 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。
遇到这种情况怎么办?
- 存储库不是直接从控制器调用的。
- 服务想要return DTO 无条件。
- 我应该创建一个与用户实体具有相同属性的附加 Dto 吗?
通常我 class 按照以下方式实施,
实体: 包含与您的实际数据库对象相关的所有数据。 (@transient 注释的附加数据)
DTO : 自定义 class 创建以提供实体与所需 JSON.
之间的兼容性
Mapper : 它可以将 Entity 转换为 DTO,反之亦然。
在排序中,为数据库对象创建实体,n 个 DTO 以确保真实需要并使用映射器 class 将其转换为适当的类型并将此条款写入您的服务 class。因此,根据您的需要创建 DTO 并在服务 class 中实现将它们组合在一起的逻辑。
(当想在单个实体中绑定多个 DTO 或将其分散时,最好使用接口或继承。)
现在来回答你的问题,
我想知道当实体中存在的 属性 值在 DTO 中不存在时如何将 DTO 转换为实体。
答案:使用 Mapper class 转换它。根据我上面的定义,实体是数据库对象,并且 DTO 是预期的 JSON。因此,在您的 DTO 中强制存在并不重要。您可以根据需要自定义 DTO。
存储库不是直接从控制器调用的。
答案:很明显,您必须这样做,并且采用正确的实施方式。
我是否应该创建一个与用户实体具有相同属性的附加 DTO?
java
回答:可以,但如果是强制要求的话。我的建议是遵循我之前定义的结构,它在将来也会有帮助,假设你需要一种新的数据,你只需要在映射器 class 中添加一个函数,它相应地 return 数据,你也可以修改从一个地方开始,到处使用。
此建议基于您的代码。
- 将所有逻辑代码控制器移至服务 class
- 在服务中 class 触发查询并包含 userDTO 的数据。
UserDto userDto = userService.findUser(userId)
- 它给你电子邮件。基于此激发另一个获取用户的查询。
我作为开发者的个人建议,
创建一个 JHipster 项目并检查它们的流程,它可以让您了解如何以专业的方式创建结构。
我找了无数问题。 但是大部分问题如下。
- 实体 -> Dto
- 实体和 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。
遇到这种情况怎么办?
- 存储库不是直接从控制器调用的。
- 服务想要return DTO 无条件。
- 我应该创建一个与用户实体具有相同属性的附加 Dto 吗?
通常我 class 按照以下方式实施,
实体: 包含与您的实际数据库对象相关的所有数据。 (@transient 注释的附加数据)
DTO : 自定义 class 创建以提供实体与所需 JSON.
之间的兼容性Mapper : 它可以将 Entity 转换为 DTO,反之亦然。
在排序中,为数据库对象创建实体,n 个 DTO 以确保真实需要并使用映射器 class 将其转换为适当的类型并将此条款写入您的服务 class。因此,根据您的需要创建 DTO 并在服务 class 中实现将它们组合在一起的逻辑。 (当想在单个实体中绑定多个 DTO 或将其分散时,最好使用接口或继承。)
现在来回答你的问题,
我想知道当实体中存在的 属性 值在 DTO 中不存在时如何将 DTO 转换为实体。
答案:使用 Mapper class 转换它。根据我上面的定义,实体是数据库对象,并且 DTO 是预期的 JSON。因此,在您的 DTO 中强制存在并不重要。您可以根据需要自定义 DTO。
存储库不是直接从控制器调用的。
答案:很明显,您必须这样做,并且采用正确的实施方式。
我是否应该创建一个与用户实体具有相同属性的附加 DTO? java
回答:可以,但如果是强制要求的话。我的建议是遵循我之前定义的结构,它在将来也会有帮助,假设你需要一种新的数据,你只需要在映射器 class 中添加一个函数,它相应地 return 数据,你也可以修改从一个地方开始,到处使用。
此建议基于您的代码。
- 将所有逻辑代码控制器移至服务 class
- 在服务中 class 触发查询并包含 userDTO 的数据。
UserDto userDto = userService.findUser(userId)
- 它给你电子邮件。基于此激发另一个获取用户的查询。
我作为开发者的个人建议,
创建一个 JHipster 项目并检查它们的流程,它可以让您了解如何以专业的方式创建结构。