【发布时间】:2020-11-30 18:32:18
【问题描述】:
我正在构建一个 MealPlanner 应用程序,它根据用户偏好构建膳食菜单,我需要一些指导来设置 DTO 中的 2 个字段(字段名称:preferenceType、resultState)。
实体结构(命名为 Meal):
class Meal {
String itemName; //Such as Pizza, Sandwich
double portion; //such as 1.5
double cost; //such as 15.5, default currency is dollars
}
DTO 的结构:
class MealDTO {
//Identical to Meal
String itemName;
double portion;
double cost;
//Additional fields in DTO
String preferenceType; //FAT FREE, DAIRY FREE, VEGETARIAN
String resultState; //OPTIMAL, FEASIBLE, INFEASIBLE
}
在两个类之间映射值的类:
public class FieldsMapper {
// MealDTO -> Meal
public Meal MealDtoToMeal(MealDTO mealDto) {
Meal meal = new Meal();
meal.setItemName(mealDto.getItemName());
return meal;
}
//Meal -> MealDTO
public MealDTO MealToMealDto(Meal meal) {
MealDTO mealDto = new MealDTO();
mealDto.setItemName(meal.getItemName());
mealDto.setPortion(meal.getPortion());
mealDto.setCost(meal.getCost());
return mealDto;
}
}
Please click here: MealPlanner full flow
这样,preferenceType 和 cost 的值就会丢失。 如何将preferenceType、resultState 映射到DTO?
(注意:膳食计划流程作为步骤
- 将用户请求(仅包含 itemName)映射到 MealDTO(除 itemName 之外的其他字段为空)。
- 使用 FieldsMapper 将 MealDTO 映射到 Meal。
- 将膳食传递给第三方,黑盒逻辑。此逻辑将返回一个结构为 {
, , , } 的地图
- 部分和成本映射到膳食实体字段部分成本。
- 将 Meal 映射到 MealDTO 并返回 DTO 对象。)
【问题讨论】:
-
如果您的
Meal中的portion将具有十进制值,则它不应该是int数据类型。请考虑更正。 -
您没有向我们展示您如何使用 MapStruct,我们不知道您如何真正映射这两个对象,请考虑添加更多代码
-
@hocikto,Mapstruct 使用 getter 和 setter 来映射字段。为避免任何混淆,我将其替换为自定义类 FieldsMapper。问题和图表已更新。
-
看起来很简单.. 确保保存黑盒中的值的对象确实设置在那里(通过调试或简单地将对象打印到控制台),然后检查你所在的变量调用 mapper.MealToMealDto(meal) 也许你把它分配错了..你能告诉我们你调用映射器的代码吗?