繁体   English   中英

Spring 引导 - 如何将 DTO 转换为属于另一个 DTO 的实体

[英]Spring boot - How to convert DTO to entity that is part of another DTO

我有代表我的数据库的实体——用户、食谱和标签。 对于数据操作,我使用 DTO。 所以 UserDTO、RecipeDTO、TagDTO。 当我定义实体之间的关系时,我使用它的基本 User、Recipe、Tag 形式,但是当我在 DTO class 中定义这些关系时,我使用它的 DTO 形式。

例如:

DTO Class 看起来像这样

public class UserDTO{
 private String name;
 private String email
 private List<RecipeDTO>
}

public class RecipeDTO{
 private String title;
 private String description;
 private UserDTO user;
}

我知道如何 map 到实体的 DTO,以便我可以对数据库中的数据执行操作 (CRUD)。

private Recipe convertToEntity(RecipeDTO recipeDTO){
 Recipe recipe = new Recipe();
 recipe.setTitle(recipeDTO.getTitle);
 recipe.setDescription(recipeDTO.getDescription);
}

但是RecipeDTO里面也有一个UserDTO,我还需要map到一个实体。 我该怎么做呢? 所以我试图在映射中实现映射.... (??)

我可以想到以下解决方案。

创建将 UserDTO 转换为 User 的方法:

private User convertUser(UserDTO userDTO){
 User user = new User();
 user.setName(userDTO.getName());
 user.setEmail(userDTO.getEmail());
}

然后在将RecipeDTO 映射到Recipe 时使用它。

private Recipe convertToEntity(RecipeDTO recipeDTO){
 Recipe recipe = new Recipe();
 recipe.setTitle(recipeDTO.getTitle());
 recipe.setDescription(recipeDTO.getDescription());
 //Convert UserDTO
 recipe.setUser(convertUser(recipeDTO.getUser()));
}

我不确定这是否是正确的解决方案,因为随着代码变得越来越大,会有越来越多的映射。

您描述的方法没有错,并且会起作用,但是这样做确实会涉及很多艰苦的工作。

业界通常这样做的方式是让图书馆为您完成这项工作。

java 最流行的两个映射库是:

https://mapstruct.org/ (它在编译时使用注释处理并自动生成与您的示例基本相同的映射代码)

http://modelmapper.org/ (使用黑魔法和反射)

它们都易于设置/学习,并且都可以完成工作(包括在您的示例中映射嵌套对象),因此请查看“入门”部分并选择您觉得使用起来更直观的那个。

我个人的建议是选择 Mapstruct,因为它的陷阱更少,生成干净的人类可读代码并避免使用反射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM